Я добавил дополнительный код и отредактировал пост. Если мы пытаемся писать одновременно, используя оба файловых указателя, оба пишутся, а файловые указатели обрабатываются независимо, и я думаю, что это правильное поведение.

дполагал, что fopen возвращает нулевой указатель, если файл уже открыт. Но, похоже, 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);
}

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

 Jacek Cz01 мая 2018 г., 11:33
Cit: На большинстве реализаций библиотекиerrno переменной также присваивается системный код ошибки при сбое
 Lasse Vågsæther Karlsen01 мая 2018 г., 11:27
Так что же происходит в размещенном коде?
 Adriano Repetti01 мая 2018 г., 11:30
@Rajesh Речь идет об обмене файлами в Windows, если ваша реализация lib вызывает_fsopen с участиемSH_DENYNO (например), затем другая программа (или та же самая ...) может открыть файл несколько раз (также для записи). Что произойдет, зависит как от реализации, так и от базовой ОС (одновременные записи не так просты, по крайней мере, для Windows). Обратите внимание, что по умолчаниюfopen() предполагает совместное использование, потому что обычно * nix ОС используют другие примитивы синхронизации (см.fcntl())

Ответы на вопрос(1)

Решение Вопроса

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

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

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

 Rajesh01 мая 2018 г., 12:55
Я добавил дополнительный код и отредактировал пост. Если мы пытаемся писать одновременно, используя оба файловых указателя, оба пишутся, а файловые указатели обрабатываются независимо, и я думаю, что это правильное поведение.

Ваш ответ на вопрос