ubuntu中的警告返回值为fscanf'

时间:2015-08-23 12:01:41

标签: c installation scanf festival

直接通过运行通用脚本从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);
   ^

3 个答案:

答案 0 :(得分:3)

阅读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文件(并可能在上游提交补丁和/或错误报告)。

答案 1 :(得分:0)

这个警告说不检查scanf的返回值不是一个好主意。

我认为转向{{1}}是一种避免这种情况的方法,但显然不是这里所讨论的:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509

然而,这不是一个错误,只是一个警告(你的标题有点误导)

如果未使用该值,则显然不是问题。

答案 2 :(得分:0)

手册页说:

  

如果之前达到输入结束,则返回值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;
}

或者:

#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 - 输入格式con          版本