2015-02-09 4 views
0

Файл существует, и я только что прочитал его в другой функции. Другая функция закрывает файл. Теперь мой workwith() пытается открыть его и прочитать из него.Не удается прочитать из открытого файла

Мой код:

if (access(path_file, F_OK) != -1) { 
    // file exists 
    *mfs_desc = open(path_file, O_WRONLY | O_RDONLY, 0600); 
    if (*mfs_desc == -1) { 
    perror("opening file"); 
    exit(1); 
    } 
    printf("file_descriptor = %d, filename = |%s|\n", *mfs_desc, 
     path_file); 
    if ((read(*mfs_desc, superblock, sizeof(Superblock))) == - 1) { 
    perror("read superblock"); 
    exit(1); 
    } 
} 

Однако я получаю этот выход:

file_descriptor = 3, filename = |t.mfs| 
read superblock: Bad file descriptor 

Я подозреваю, что так я открываю файл не является правильным. Я хочу открыть файл для написания и чтения. Файл уже существует. Что мне не хватает?

ответ

3

Изменить эти флаги

O_WRONLY | O_RDONLY 

в

O_RDWR 

проверки here, он говорит, что флаги должны включать один из режимов доступа.

Кроме того, арбитр упоминает:

Аргумент флаги должны включать в себя один из следующих режимов доступа: O_RDONLY, O_WRONLY или O_RDWR. Эти запросы открывают только файл read- , только для записи или чтения/записи.

+1

Они не '' 'прекрасно, потому что изначально« режим »был просто логическим, указывающим, нужен ли вам доступ на запись или нет. Режим чтения-записи не существует. Когда оно было добавлено, числовое значение readonly поддерживалось равным 0 для совместимости. [V3 man page] (http://minnie.tuhs.org/cgi-bin/utree.pl?file=V3/man/man2/open.2) [Страница руководства V4] (http: //minnie.tuhs. org/cgi-bin/utree.pl? file = V4/man/man2/open.2) ... Я думаю, что Кен и Деннис были достаточно умны, чтобы знать, что 'O_RDWR! = O_RDONLY | O_WRONLY' был глупым и исправил бы если бы они могли. –

Смежные вопросы