2015-09-11 142 views
-2

我对C有点新,但基本上我有一个问题,我需要从文件中读取'-1'。可悲的是,这意味着我遇到了文件的过早结尾,因为EOF常量在我的编译器中也是-1。C - 使用fscanf从文件中读取'-1'

这会有什么样的解决方法?是否有另一个函数可以用来读取它,将EOF更改为我可以使用的东西?

在此先感谢。

,因为人们都在问它

int read() { 
    int returnVal; // The value which we return 

    // Open the file if it isn't already opened 
    if (file == NULL) { 
     file = fopen(filename, "r"); 
    } 

    // Read the number from the file 
    fscanf(file, "%i", &returnVal); 

    // Return this number 
    return returnVal; 
} 

这个数字是后来比较EOF的代码。

好吧,这可能是不好的做法,但我改变了代码以下

int readValue() { 
    int returnVal; // The value which we return 

    // Open the file if it isn't already opened 
    if (file == NULL) { 
     file = fopen(filename, "r"); 
    } 

    // Read the number from the file 
    fscanf(file, "%i", &returnVal); 

    if (feof(file)) { 
     fclose(file); 
     return -1000; 
    } 

    // Return this number 
    return returnVal; 
} 

因为我知道我永远不会从我的文件中读出任何这样的数字(它们的范围从约[-300,300]感谢您的所有帮助家伙!

+0

EOF常量是-1并不重要......应该永远不会检查您读取的值,并且因-1以外的任何原因返回为-1(或者什么都不是)被读取,你的记忆碰巧包含-1)。发布你认为你遇到问题的代码,你可以得到帮助,但没有这个问题,堆栈溢出标准是不完整的。 – mah

回答

4

的fscanf的返回值是不是被阅读的价值,而是它是项目的数量成功读取,或EOF如果发生错误。

+0

@Mildan'fscanf'至少提供*两个*值:函数状态作为其返回值,以及格式要求/指针参数指定的值。仔细阅读手册页。您应该始终检查'scanf'系列的返回值以及感兴趣值的范围。 –

+0

所以,我应该添加一个检查,看看fscanf是否返回<0项目,如果它不,那么它会读空行,因此EOF? – Mildan

+0

@Mildan你检查它是否返回想要读取的项目数,在本例中为'1'。如果不是,你需要一个回退策略,或者作为另一个答案,通过将其传递给调用者,使其为'int readval(int * returnVal)',当然也可以从'&returnVal'改变fscanf参数到'returnVal',而不是返回'returnVal',你将返回'fscanf'的返回值。困惑?不要使用像'read'或'returnVal'这样的标识符。 –

1

的问题是你的read函数不区分成功读取和错误条件之间。您应该将其更改为接受int *作为scanf写入的参数,并且该函数应该在成功读取时返回类似于0的值,并在返回错误时返回-1。您可以使用返回值scanf作为函数返回的基础。

此外,还有一个名为read的系统调用,所以你应该真的把它命名为别的东西。并且在函数结束时不要忘记fclose(file),否则会泄漏文件描述符。

+0

我会尝试他们;) – Mildan