#c #c #file #file-io
#c #c #файл #file-io
Вопрос:
В моей программе fprintf()
возвращает значение -1, что указывает на ошибку. Как я могу узнать, какая фактическая ошибка была?
Комментарии:
1. Она находится на 36-м символе строки 42.
2. Просто чтобы объяснить ироничный (и забавный) ответ @AProgrammer: когда вы задаете вопрос, связанный с вашим кодом, на самом деле намного эффективнее опубликовать фактический код с вашим вопросом. Мы явно не можем угадать, что вы ввели.
3. @ereOn: В этом нет иронии. ИСТИННЫЙ ответ на то, что является ФАКТИЧЕСКОЙ ошибкой, действительно равен 42. Я все еще ломаю голову, пытаясь понять, что означает 36 🙂
4. 36 — это самый большой квадрат, меньший, чем 42 😉
5. @AProgrammer: теперь это имеет смысл. приветствия! 🙂
Ответ №1:
#include <errno.h>
#include <string.h>
...
rc = fprintf(...)
if (rc < 0)
printf("errno=%d, err_msg="%s"n", errno,strerror(errno))
Комментарии:
1. Вам не следует объявлять
errno
себя, просто включите<errno.h>
; это может быть макрос, а не переменная.2. точка зрения принята. зависит от операционной системы libc. Я думаю, что в старых Linux libcs вам пришлось бы объявлять ее извне. исправлено.
3.Ошибаешься, адирау, это еще хуже.
#ifndef
будет работать только для макросов препроцессора, а не для переменных. Вам лучше отказаться от всего этого#ifdef
блока, поскольку ISO предписывает, чтоerrno.h
определяетerrno
«переменную». Я исправил это для вас, надеюсь, вы не возражаете.4. но errno — это макрос препроцессора, по крайней мере, в unix и Linux 🙂
5.
errno
может быть что-то вроде#define errno (*__get_thread_local_errno_ptr())
, но это также может быть простоextern int errno;
. Вы не знаете. Всегда используйтеerrno.h
.
Ответ №2:
Вам нужно проверить значение errno
. Большинство библиотечных функций присваивают ей определенный код ошибки, и вы можете либо посмотреть его в errno.h
, либо использовать perror
or strerror
, чтобы получить версию, понятную пользователю.
Например:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main (void) {
FILE *fh = fopen ("junk", "w");
if (fh != NULL) {
if (fprintf (fh, "%s", "hello") < 0)
fprintf (stderr, "err=%d: %sn", errno, strerror (errno));
fclose (fh);
}
return 0;
}