我正在学习C语言并通过编写一个小程序来练习,该程序从文本文件中读取整数并将它们存储到数组中。但是,整数永远不会以某种方式存储,并且数组是空的。

 int readNumbers(int array[], char* fname) {
 78
 79
 80     int numberRead = 0;
 81     FILE* fp;
 82     int ch;
 83     int i = 0;
 84
 85
 86
 87     fp = fopen(fname, "r");
 88     // Test to see if the file was opened correctly
 89
 90     if (fp == NULL) {
 91             printf("Error opening file\n");
 92             return;
 93     }
 94     // Now read until end of file
 95
 96     while (ch = fgetc(fp) != EOF && isdigit(ch)) {
 97             array[i++] = ch;
 98     }
 99     if (ferror(fp)) {
100             return;
101     }
102     // Close the file pointer
103
104     fclose(fp);
105
106     // Return the number of items read
107     return numberRead;
108 }

文本文件如下:
1 2 3 4 5 6 7 8 9

提前谢谢。
我已经更新了代码。这几乎可以工作,但它将55等字符解释为55。所以我的数组有两个5
 while ((ch =fgetc(fp)) != EOF) {
 97             if (ch != ' ' && ch != '\n') {
 98                     array[counter] = ch - '0';
 99                     counter++;
100                     numberRead++;
101             }
102     }

最佳答案

要详细说明Matt McNabb在评论中所说的,没有值就不能有return(除非它在void函数中)。函数声明为返回readNumbers(),因此所有返回路径都必须返回一个int。如果有文件错误,您可能希望返回-1,因为0是(类型:))要读取的有效字符数。
由于输入文件中的数字之间有空格,因此需要更改int循环中的逻辑。
while
一旦读取一个非数字字符就会失败。
我还应该提到,您正在将读取的每个字符的数值存储到数组中,这可能不是您想要的。例如,在ASCII中,“0”字符的数值为48,“1”字符的数值为49,等等。
注意:确保调用while ((ch = fgetc(fp)) != EOF && isdigit(ch))的函数提供一个足够大的数组来处理任何可能的结果。。。
尽量避免在程序内部使用readNumbers(),只要在exit()中使用即可。另外,与其用main()杀死你的程序,还不如先打印某种错误消息(通常是给stderr),然后优雅地死去。至于创建合适的错误消息,请查看exit()函数<stdio.h>,并查看perror()
您可以在<errno.h>中打印错误消息并返回-1,然后让调用函数(例如readNumbers())决定错误是否严重到程序应该终止。或者让调用函数也处理错误消息的打印。

关于c - 无法使fgetc工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26227301/

10-10 13:22