Как найти фактическую ошибку fprintf ()?

#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;
}