我正在学习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
等字符解释为5
和5
。所以我的数组有两个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/