为什么这段代码不起作用? (C基本IO)

时间:2015-09-05 13:39:40

标签: c

我最近写了一段代码来计算文本文件中的行数,然而,while循环部分只是不能正常工作并永远循环。任何人都可以帮我找出这段代码的问题是什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;
int main() {
    fp=fopen("C:\\Users\\Alan\\Desktop\\text.txt","r");
    int i=0;
    while(!feof(fp)){
        i++;
    }
    fclose(fp);
    printf("The Number Of Sentence In That File: %d",i);
    getch();

}

3 个答案:

答案 0 :(得分:2)

问题是通过调用feof(fp)没有进展,所以执行在文件的开始时停止。你需要明确地调用类似getchar(), fscanf(), fgetc(),等的东西。这是一个例子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *fp;
int main() {
    fp=fopen("test.txt","r");
    int i=0, ch=0;

    while((ch = fgetc(fp)) > 0){
        if(ch == '\n') 
            i++;          
    }
    fclose(fp);
    printf("The Number Of Sentence In That File: %d\n",i);
    getchar();
}

答案 1 :(得分:1)

对于你想要的东西你可以试试这样的东西 -

 char *s;
 s=malloc(255);
 while(fscanf(fp,"%254s",s)==1)
 {
    i++;
 }
 ...
 free(s);

这将提供所需的输出。

另外 -

 while(!feof(fp))
控制循环的

feof总是错误的。你永远不应该在循环中使用feofRefer here

答案 2 :(得分:1)

你的循环没有终止,因为你没有对循环中的文件做任何事情。

我建议使用feof而不是使用getline()来控制循环。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *fp;
int main() {
    fp=fopen("C:\\Users\\Alan\\Desktop\\text.txt","r");

    int i = 0;
    char *line = NULL;
    size_t len = 0;

    while (getline(&line, &len, fp) != -1)
        i++;

    free(line);
    fclose(fp);
    printf("The Number Of Sentence In That File: %d\n",i);
}

注意:在这种情况下,line设置为NULLlen设置为0,因此getline()将分配一个缓冲区来存储line 1}}。应该在程序返回之前释放此缓冲区。

<强>更新

如果您还想知道文件中的字符数,可以使用getline的返回值:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *fp;
int main() {
    fp=fopen("C:\\Users\\Alan\\Desktop\\text.txt","r");

    int i = 0;
    int j = 0;
    int read = 0;
    char *line = NULL;
    size_t len = 0;

    while ((read = getline(&line, &len, fp)) != -1) {
        i++;
        j += read;
    }

    free(line);    
    fclose(fp);
    printf("The Number Of Lines In That File: %d\n", i);
    printf("The Number Of Chars In That File: %d\n", j);
}