Поскольку ответил Yunnosch , вы, вероятно, забыли проверить на предмет отказа fopen (3) . Лучшая привычка - всегда проверять, по крайней мере, кодируя:
fp = fopen("abc.txt","r");
if (fp == NULL) { perror("fopen abc.txt"); exit(EXIT_FAILURE); };
и привыкни делать это, по крайней мере, везде. Использование perror (3) (или strerror (3) с errno (3) ) является полезной привычкой, так как вам нужна причина, связанная с неудача (дается errno
возможно через perror
).
В общем, всегда читайте документацию функций, которые вы используете (для стандартных функций, по крайней мере на некоторых справочных веб-сайтах и, возможно, в стандарте C11 n1570 ) и позаботятся о том, как обработать их ошибку (по крайней мере, путем проверки на отказ и выхода с полезным сообщением stderr
); для функций Unix см. их страницы man
(в Linux начните с intro (2) и intro (3) ; для Solaris начните с intro (2) & intro (3) ..). В вашем Unix-терминале попробуйте также man fopen
... Для стандарта POSIX запустите здесь .
меня заинтриговало отсутствие сообщений, которые я пытаюсь напечатать на экране.
Это просто. stdout буферизуется (см. Также setvbuf (3) ) и часто буферизуется строкой. Таким образом, printf
, который не заканчивается на \n
, выводится в буфере, но еще не на экране. Привычка - почти всегда заканчивать строку формата управления printf (3) новой строкой, либо явно очищать буфер, используя fflush (3) .
Для новичка есть несколько причин, чтобы не заканчивать ваш printf
явным \n
. Так что используйте вместо
printf("jkjkkjkj\n");
В противном случае, вызывайте fflush(NULL);
довольно часто в вашей программе. Кстати, по этим причинам буферизации, fflush(NULL)
должно быть сделано перед вызовом system (3) , fork (2) , execve (2) и других важные функции всей программы.
оптимизировано написано около строки №
Это, вероятно, происходит в самой стандартной библиотеке C (например, в getc
из некоторых libc.so
), которая обычно не компилируется с отладочной информацией. На практике доверяйте своей стандартной библиотеке C: в вашем коде гораздо больше ошибок, чем в libc
.
Ваш собственный исходный код должен быть скомпилирован с gcc -Wall -Wextra -g
(с просьбой к компилятору GCC выдать все предупреждения и отладочную информацию в формате DWARF , который может использоваться gdb
отладчик), и вам нужно улучшить свой код, чтобы вообще не получать предупреждений до с помощью отладчика gdb
.
Осознайте неопределенное поведение , потратьте несколько часов на чтение UB и будьте напуганы UB.