我正在学习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 }
答案 0 :(得分:1)
你应该在这里使用括号while (ch = fgetc(fp) != EOF && isdigit(ch))
,它应该是while ((ch = fgetc(fp)) != EOF && isdigit(ch))
否则你将ch
存储fgetc(fp) != EOF
的值为1或0(TRUE或FALSE)
答案 1 :(得分:1)
为了扩展Matt McNabb在评论中所说的内容,你不能没有值return
(除非它在void
函数内)。您的readNumbers()
函数被声明为返回int
,因此所有返回路径必须返回一个int。如果出现文件错误,您可能希望返回-1,因为0是(种类:))要读取的有效字符数。
由于输入文件中的数字之间有空格,因此您需要更改while
循环中的逻辑。
while ((ch = fgetc(fp)) != EOF && isdigit(ch))
就会失败。
我还应该提一下,您要将读取的每个char的数值存储到数组中,这可能不是您想要的。例如,在ASCII a' 0' char的数值为48,' 1'值等于49等。
PS。确保调用readNumbers()
的函数提供足够大的数组来处理任何可能的结果......
尽可能避免在程序中深入使用exit()
,并在main()
中使用它。此外,不是仅仅使用exit()
杀死你的程序,而是多更好地首先打印某种错误消息(通常是stderr),然后然后< / em>优雅地死去。至于创建合适的错误消息,请查看<stdio.h>
函数perror()
,然后查看<errno.h>
。
您可以在readNumbers()
中打印错误消息并返回-1,然后让调用函数(例如main()
)决定错误是否错误以致程序应该死。或者让调用函数处理错误消息的打印。
答案 2 :(得分:1)
// this following code modification will handle your most recent question
int value = 0; // place to accumulate numbers
int inNumber = 0; // to avoid spurious input in array[]
// note: the following expects that 'ch' is defined as an integer
while ((ch =fgetc(fp)) != EOF)
{
if (ch >= '0' && ch <= '9') // only process numeric characters
{
value *= 10;
value += (ch - 0x30); // convert alpha to binary
inNumber = 1;
}
else
{ // break between numbers
if( 1 == inNumber )
{
array[counter] = value;
counter++;
numberRead++;
value = 0; // reset for next number
inNumber = 0;
}
}
}