2013-12-09 5 views
-5

Я не знаю, что происходит, но каждый раз, когда я открываю файл с fopen, он возвращает NULL , но если я попытаюсь напечатать адрес, то он напечатает действительный адрес Если я попытаюсь прочитать запись в другой файл ничего не случилось, я открываю его в режиме «w», и я открыл все разрешения для всех пользователей.C: fopen() всегда возвращает NULL

enter image description here

+2

Где вы видите, что 'fopen' возвращается нуль ??? Ничто в том, что вы опубликовали, указывает, что 'fp' или' dest' равно null. Откуда у вас эта идея? Хотя неверно использовать спецификатор '% d' для указателей' printf' (почему вы его использовали?), Ваш вывод ясно показывает, что указатели * не являются нулевыми *. – AnT

ответ

2

Использование \\ вместо // в ваших имен путей. Символ слэш (/) не нужно записывать дважды, когда внутри строки C. С другой стороны, символ обратной косой черты (\) должен быть дважды написан, если используется внутри строки C, чтобы не путать с escape-символом.

Я не уверен, но я думаю, что Windows также принимает/как разделитель каталогов для имен файлов.

+0

все еще не работает, http://i39.tinypic.com/2r2tzip.png – user2927785

+1

errno возвращает «без ошибок». fopen() не возвращает NULL, поэтому ... что не работает? –

+0

BTW: это не лучший способ скопировать двоичный файл на другой. Что, если код символа EOF присутствует где-нибудь в исходном файле? Лучше использовать 'fread()' и 'fwrite()' –

1

Вы путаете синтаксис - любой из них должен работать:

fp = fopen("D:\\shortcut\\asd.jpg", "r"); 

или

fp = fopen("D:/shortcut/asd.jpg", "r"); 
1

Там же несколько ошибок.

  • fetc() возвращает Int, а не обугленный, назначая fgetc() возвращаемое значение к полукоксу сделает невозможным отличить EOF от действительного байта в файле.

  • Вы открываете двоичные файлы, поэтому вам нужно сообщить fopen(), что по умолчанию открывать файлы в текстовом режиме.

  • // не является разделителем каталогов на окнах, \ или / является. Поскольку \ нуждается в экранировании, когда в строковом литерале C должно быть указано \\

  • Необходимо проверить, успешно ли fopen, и выдавать соответствующую ошибку, если она не работает.

  • Необходимо отправить код, а не снимок экрана с кодом.

Do:

FILE *fp, *dest; 
int c; 

if ((fp = fopen("D:\\shortcut\\asd.jpg", "rb")) == NULL) { 
    perror("fp fopen"); 
    return 1; 
} 
if ((dest = fopen("D:\\sssssssssssss.jpg", "wb")) == NULL) { 
    perror("dest fopen"); 
    return 1; 
} 

while ((c = fgetc(fp)) != EOF) { 
    putc(c, dest); //might even want to check if putc fails. 
} 

fclose(dest); 
fclose(fp); 

return 0; 
Смежные вопросы