fopen () возвращает нулевой указатель, но файл определенно существует - PullRequest
17 голосов
/ 14 июля 2011

У меня следующий код:

FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
    perror("Can't open file");
} 

Возвращено сообщение об ошибке:

Невозможно открыть файл: нет такого файла или каталога

Файл data.txt определенно существует в рабочем каталоге (он существует в каталоге, содержащем мои файлы .c и .h), так почему же fopen () возвращает указатель NULL?

Ответы [ 7 ]

12 голосов
/ 14 июля 2011

Стандартная проблема. Попробуйте

FILE *txt_file = fopen("C:\\SomeFolder\\data.txt", "r");

т.е. попробуйте сначала открыть его с полным абсолютным путем; если это работает, тогда вам просто нужно выяснить, с какой текущей директорией _getcwd(), а затем исправить свой относительный путь.

9 голосов
/ 14 июля 2011

Возможно ли, что имя файла на самом деле не "data.txt"?

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

Один из способов точно сказать, что имена файлов действительно такие, какими вы думаете:

$ python
>>> import os
>>> os.listdir('.')
3 голосов
/ 12 ноября 2016

Моя проблема заключалась в том, что у меня был файл filename.txt, и я не осознавал, что на самом деле это был filename.txt.txt из-за того, что окна не показывают расширение.

2 голосов
/ 28 октября 2014

Невидимый символ пробела в имени файла?

Раз в год у меня возникает похожая проблема: Я пытаюсь открыть файл с именем файла в строке, полученной из операции sting. Когда я печатаю имя, кажется, что все в порядке, но fopen () возвращает нулевой указатель. Единственная помощь - это печать имени с разделителями, показывающими точное начало и конец строки имени файла. Конечно, это не помогает с непечатными символами.

2 голосов
/ 14 июля 2011

Убедитесь, что ваш входной файл находится в том же каталоге, что и исполняемый файл, который может отличаться от каталога, в котором хранятся ваши исходные файлы.Если вы запускаете программу в отладчике IDE, убедитесь, что в вашем рабочем каталоге указано местоположение входного файла.Кроме того, если вы работаете в * nix, а не в Windows, вам может понадобиться добавить «./» к имени входного файла.

0 голосов
/ 16 марта 2019

Я обнаружил ту же ошибку при открытии в Linux из файла сценария, поврежденного Windows.

ENOENT 2 Нет такого файла или каталога

Wordpad в Windows (или другой виновник Microsoft) вставленCRLF = (0x0D, 0x0A) в мои файлы сценариев Linux вместо новой строки = LF = 0x0A.Когда я прочитал имя файла в буфер и вызвал fopen, если произошел сбой из-за невидимого добавленного символа CR.

В редакторе Codelite в Linux Mint мне удалось показать символы EOL («Просмотр»> «Показать EOL») и удалитьих с помощью функции поиска и замены, используя копирование и вставку CRLF из поврежденных файлов сценариев и LF из нетронутого файла в текстовые поля.

0 голосов
/ 02 сентября 2016

У меня просто была похожая проблема, подобная этой, когда я знал, что путь был правильным, и файл находился в правильном месте.Проверьте права доступа к файлу.Возможно, что программа не может получить доступ к файлу, потому что ему отказано в разрешении.

...