无法让fgetc工作

时间:2014-10-07 01:30:05

标签: c fgetc

我正在学习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     }

3 个答案:

答案 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;
        }
    }
}