предупреждение в Ubuntu в возвращаемом значении «fscanf»

установка фестивальной системы синтеза речи с http://festvox.org/ ...напрямую, запустив общий скрипт. Столкнувшись с указанной ниже проблемой .....эта проблема повлияет на мою работу над фреймворком фестиваля или нет ?????

eps.c: In function ‘getd’:

eps.c:142:7: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result [-Wunused-result]

   fscanf(fp, "%d %d", x, y);
   ^

person Sukhpreet Gill    schedule 23.08.2015    source источник
comment
Какой у Вас вопрос? Кроме того, обратите внимание, что предупреждение не всегда является ошибкой.   -  person fuz    schedule 23.08.2015


Ответы (3)


Это предупреждение говорит о том, что не проверять возвращаемое значение scanf — не очень хорошая идея.

Я думал, что приведение к (void) было способом избежать этого, но, видимо, это не так, как обсуждается здесь: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509

Однако это не ошибка, которую вы получаете, а просто предупреждение (ваш заголовок вводит в заблуждение)

Если значение не используется, это явно не проблема.

person LBes    schedule 23.08.2015
comment
окей я понял....спасибо Отлично!!!.....................должен ли я продолжать дальнейшую установку фестивальной системы синтеза речи ..не обращая столько внимания на это предупреждение ..???????????? - person Sukhpreet Gill; 23.08.2015
comment
Я не могу точно сказать, потому что я никогда не использовал это раньше. На вашем месте я бы продолжил установку, и если у вас возникнут проблемы в будущем, вернитесь к этому предупреждению. Не забудьте поставить отметку, если ответ вам помог :) - person LBes; 23.08.2015

Прочтите документацию по fscanf(3). Вы должны использовать возвращенное количество успешно отсканированных элементов, например. код примерно такой:

int x = 0, y = 0;
if (fscanf(fp, "%d %d", &x, &y) < 2) {
   fprintf(stderr, "missing numbers at offset %ld\n", ftell(fp));
   exit(EXIT_FAILURE);
}

так что вы могли бы улучшить файл eps.c (и, возможно, отправить исправление и/или отчет об ошибке вверх по течению).

person Basile Starynkevitch    schedule 23.08.2015

На странице руководства говорится:

Значение EOF возвращается, если конец ввода достигнут до того, как произойдет первое успешное преобразование или ошибка сопоставления. EOF также возвращается, если возникает ошибка чтения, и в этом случае устанавливается индикатор ошибки для потока (см. ferror(3)), а errno устанавливается для индикации ошибки.

Это означает, что вы можете проверить EOF:

#include<stdio.h>

int main(void){
    int a;
    printf("Please give the value of A: ");

    if(scanf("%d",&a) != EOF){
        printf("\nThe value of A is\t%d\n",a);
    }

    return 0;
}

Or:

#include<stdio.h>
#include <errno.h>
#include<string.h>

int main(void){
    int a, errnum = errno;
    printf("Please give the value of A: ");

    if(scanf("%d",&a) == EOF){
        fprintf(stderr, "Value of errno: %d\n", errno);
        perror("Error printed by perror");
        fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
    }

    printf("\nThe value of A is\t%d\n",a);
    return 0;
}

Это относится к:

scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf — преобразование входного формата

person Michi    schedule 23.08.2015
comment
Плохой ответ, если одно число было введено в формате "%d %d" с запросом на два (т.е. scanf("%d %d", &x, &y) дает только 1...) - person Basile Starynkevitch; 23.08.2015
comment
@Basile Starynkevitch Сэр, ответ был связан только с одним, а не с двумя, что угодно. Не стесняйтесь быть не согласным с моим ответом. Если вы действительно хотите поговорить о том, что хорошо, а что нет, я всегда использую это ==›› stackoverflow.com/questions/31770861/ - person Michi; 23.08.2015
comment
Тогда тест должен быть if (scanf("%d", &x)<1) (включая случай EOF, поскольку известно, что EOF отрицателен) - person Basile Starynkevitch; 23.08.2015