Qubc
@Qubc
Ненавижу полисемию.

Почему fopen устанавливает ошибку Invalid argument в errno при fopen в режиме r+ после w и fopen в режиме w+ после r?

// gcc (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0 , msvc v143 тоже самое
//#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <errno.h>

int main ( void ) {
    FILE* pFile;
    int er;

    pFile = fopen ( "file.txt", "w" );
    er = errno;
    perror ( "?" ); // ? : No error
    fclose ( pFile );

    pFile = fopen ( "file.txt", "r+" );
    er = errno;
    perror ( "?" ); // ? : Invalid argument
    fclose ( pFile );

    return 0;
}

// gcc (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0 , msvc v143 тоже самое
//#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <errno.h>

int main ( void ) {
    FILE* pFile;
    int er;

    pFile = fopen ( "file.txt", "r" );
    er = errno;
    perror ( "?" ); // ? : No error
    fclose ( pFile );

    pFile = fopen ( "file.txt", "w+" );
    er = errno;
    perror ( "?" ); // ? : Invalid argument
    fclose ( pFile );

    return 0;
}
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Интересный вопрос. Ответа у меня нет, что-то не приходилось использовать режимы "+".
Попробуйте обнулять errno перед вызовом fopen. Возможно значение, осталось от предыдущего вызова. Вообще читать errno надо, только если fopen вернул NULL. При нормальном завершении errno не меняется.
И если pFile == NULL, очевидно, что не надо вызывать fclose.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы