2013-02-05 33 views
0

基本上我应该制作一个复制Unix -wc命令的程序。标志-l,-w,-c和-L应该分别显示行中的#行,#行,#行和#行中的字符。我的代码C(读入文件)有什么问题-wc Unix命令程序

我在阅读文本文件时遇到了问题(首次在C中执行此操作)。我使用了GDB,发现我的问题在于读取文件。过了一段时间后,无论出于何种原因,它都会读取空字符。

请假定除了读取文件外,我的代码都是正确的。

这里是我的代码:

void readInFile(char** argv, int arg, int addFlags, int argc) 
{ 
    FILE *myFile; 
    char c; 
    int wordCount = 0, lineCount = 1, longestLine, characterAmount = 0; 
    int charactersInLine = 0; 

    myFile = fopen(argv[arg], "r"); 
    if(!myFile) 
    { 
     printf("%s not found!", argv[arg]); 
     exit(EXIT_FAILURE); 
    } 

    while(c != EOF) 
    { 
     c = fgetc(myFile); 
     putchar(c); 
     characterAmount++; 
     charactersInLine++; 

     if(c == ' ') 
     wordCount++; 
     if(c == '\n') 
     { 
     if(charactersInLine > longestLine) 
     longestLine = charactersInLine; 
     charactersInLine = 0; 
     lineCount++; 
     wordCount++; 
    } 
} 

感谢您的时间!

+0

作为一般性提示,您应该将'c'与''\ n''和''''比较,而不是数字值。它使事情变得更清晰。 – Peter

回答

3

这正成为最常见的问题之一,嘿。

你错过了那个fgetc()返回int而不是char。这是因为EOF不是一个有效的字符,所以需要更大的类型。见this documentation, for instance

您也在测试c之前第一次分配它,这基本上使您的代码依赖于未初始化变量中发生的任何事情。这是个问题。

此外,您应该在计数之前测试EOF

此外,在代码中使用幻数是一个坏主意。

此:

if(c == 32) 

可以写成:

if(c == ' ') 

这:

if(c == 10) 

可以是:

if(c == '\n') 

在我看来,它们都更加清晰。

+0

好的,我改变了我的代码,如我的程序和这里所建议的,但我仍然不明白我应该用什么替代fgetc。非常感谢。对于C编程仍然是新的。 – juice

+0

不要忘记初始化c,或使用不同的循环 – ydroneaud