@Artyom_Kopan

Как решить проблему с открытием текстового файла в C?

У меня есть следующий фрагмент кода:

FILE* openInputFile()
{
    printf("Enter the name of the input file: ");
    char inputFileName[PATH_MAX + 1];
    scanf("%s", inputFileName);
    if (strstr(inputFileName, ".txt") == NULL)
        strcat(inputFileName, ".txt");
    FILE* inputFile = fopen(inputFileName, "r");
    return inputFile;
}

int main()
{
    FILE* inputFile = openInputFile();
    if (inputFile == NULL) {
        printf("File open error!");
        return 0;
    }
    ...
    return 0;
}

Этот код при попытке открыть файл выдаёт "File open error!", то есть функция openInputFile возвращает NULL.
Почему так получается и что можно с этим сделать?
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 4
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Код выглядит правильно. Смотрите в свойствах проекта, какая директория является текщей для программы. Может быть это не папка с проектом, а папка, где лежит собранный экзешник. Попробуйте запихать файл туда.

Попрбуйте файл засунуть в корень диска и ввести абсолютный путь до него.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Потому что практически все функции могут вернуть ошибку тем или иным образом.
Когда fopen возвращает NULL, то это сигнал, что произошла ошибка при выполнения функции. Вы должны проанализировать значение errno и вывести осмысленное сообщение для пользователя.
https://en.cppreference.com/w/c/io/fopen
Сейчас же у вас на все ошибки выдается единственное сообщение. Вы можете просто вызывать функцию strerror с кодом ошибки errno, чтоб получить нормальное актуальное сообщение об ошибке.
https://en.cppreference.com/w/c/string/byte/strerror

Да. Вводите полный путь к файлу, тогда у вас не будет ошибок связанных с отсутствием файла там где программа пытается его найти. Но это не отменяет правильной обработки ошибок в программе.
Ответ написан
Комментировать
@AntonSazonov
Выведите на экран что у вас находится в inputFileName перед вызовом fopen.
Ответ написан
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
После открытия файла нужно проверить состояние ошибки и вывести осмысленное сообщение о ней.

man perror()
man strerror()
man errno()
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы