fopen возвращает нулевой указатель, если файл уже открыт - PullRequest
0 голосов
/ 01 мая 2018

Я предполагал, что fopen возвращает указатель NULL, если файл уже открыт. Но, похоже, fopen не возвращает NULL, если файл уже открыт в режиме "w". Ниже приведен код, который я использовал, чтобы попробовать это, и я не получаю никаких ошибок. Я пробовал с mingw32, а также с компиляторами TDM-GCC-64. Если я не ошибаюсь, C ++ выдает ошибку, если файл уже открыт.

#include<stdio.h>
int main()
{
    FILE *fp1, *fp2;
    fp1=fopen("file1.txt", "w");

    fp2=fopen("file1.txt", "w");
    if(fp2==NULL)
    {
        printf("Error in opening file\n");
        return(0);
    }
//       Edit: added following code to check the behavior if write operation
// is performed simultaneously


    fputc('A', fp1);
    fputc('M', fp1);
    fputc('S', fp1);
    fputc('B', fp2);
    fclose(fp1);
    fclose(fp2);
    return(0);
}

Edit: Добавлен дополнительный код для записи некоторых данных в fp1 и fp2 и просмотра поведения. При выполнении файл file1.txt содержит данные «BMS» и, по-видимому, работает корректно, а fp1 и fp2 перемещаются независимо, как и ожидалось. Сначала AMS пишется с использованием fp1, а затем A заменяется на B с использованием fp2, а окончательный вывод - BMS.

1 Ответ

0 голосов
/ 01 мая 2018

В соответствии со стандартом C (7.19.3.8) он определяется реализацией:

Функции, которые открывают дополнительные (не временные) файлы, требуют имя файла, которое является строкой. Правила составления допустимых имен файлов определяются реализацией. Возможность одновременного открытия одного и того же файла несколько раз также определяется реализацией.

Кроме того, это не рекомендуется по другим причинам, см., Например, Рекомендация SEI CERT C по стандарту кодирования FIO24-C :

Некоторые реализации не позволяют открывать несколько копий одного и того же файла одновременно. Следовательно, переносимый код не может зависеть от того, что произойдет, если это правило будет нарушено. Даже в реализациях, которые не могут сразу открыть уже открытый файл, существует условие гонки TOCTOU (время проверки, время использования), при котором второе открытие может работать с файлом, отличным от первого из-за файл перемещается или удаляется (см. FIO45-C. Избегайте условий гонки TOCTOU при доступе к файлам для получения более подробной информации об условиях гонки TOCTOU).

...