计算文件的长度不起作用

时间:2014-04-22 05:39:59

标签: c file-io

#include "stdio.h"
#include "stdlib.h"
int main()
{
    FILE *fp;
    int noOfLines =0;
    char fname[]="Rtl_Prod_Id.txt";
    printf(fname);
    fp=fopen(fname,"r");
    char ch;

    //looping for every line
    do {
        ch=fgetc(fp);
        if (ch=='\n')
            noOfLines++;
    } while(ch!=EOF);

    //line before the last line
    if (ch!='\n'&&noOfLines!=0)
        noOfLines++;
    fclose(fp);
    printf("%d",noOfLines);
    return 0;
}

我只是想计算文件中的行数。相同并不会给我任何结果。

我正在做的可能的错误

环境:AIX和编译器:CC

谢谢

编辑:我的程序成功编译但在执行.Out文件时却没有显示任何内容

P.S:虽然我得到了答案。感谢https://stackoverflow.com/users/434551/r-sahu。我已将 char ch; 更改为 int ch; 。但我想知道为什么? char声明有什么问题? 。当我要检查'\ n'和EOF字符为什么整数呢?

4 个答案:

答案 0 :(得分:4)

问题是AIX上的char实际上是unsigned char

fgetc()返回int值,-1(通常)用于表示EOF。但是,因为unsigned char不能为负数(EOF变为255),所以比较ch != EOF将始终为真,这会导致无限循环。

定义int ch;解决问题;顺便说一句,如果您使用-Wall(显示所有编译器警告),这应该在编译期间出现。

答案 1 :(得分:1)

这是一个疯狂的镜头,但改变了行

char ch;

int ch;

是合适的。 fgetc的返回类型为int,而不是char

答案 2 :(得分:1)

  1. 您应该使用<...>代替"..."来包含系统标头文件,例如stdio.hstdlib.h

  2. 您应该检查fopen的返回值是否存在错误。

  3. fgetc()的返回类型为int,而不是char

  4. 您的上一次线路调整存在逻辑缺陷。在do {} while循环之前,ch是EOF,它永远不会是'\n'。如果在上一个'\n'之后有任何字符,则需要另一个标记来记住,并在do {} while循环中正确设置。

  5. 以下是您的代码的固定版本,更灵活一点:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        FILE *fp;
        int noOfLines, isRem, ch;
    
        if (argc > 1) {
            fp = fopen(argv[1],"r");
            if (fp == NULL) {
                perror("fopen");
                exit(EXIT_FAILURE);
            }
        }
        else {
            fp = stdin;
        }
    
        noOfLines = 0;
        isRem = 0;
    
        //looping for every line
        do {
            ch = fgetc(fp);
            if (ch != EOF)
                isRem = 1;
            if (ch == '\n') {
                noOfLines++;
                isRem = 0;
            }
        } while (ch != EOF);
    
        //line before the last line
        if (isRem)
            noOfLines++;
    
        if (argc > 1)
            fclose(fp);
    
        printf("%d\n", noOfLines);
    
        exit(EXIT_SUCCESS);
    }
    

    测试:

    $ wc -l t000.c 
    44 t000.c
    $ ./a.out t000.c 
    44
    $ echo -e "abc\ndef" | ./a.out 
    2
    $ echo -ne "abc\ndef" | ./a.out 
    2
    

答案 3 :(得分:0)

  

我改变了char ch;到int ch; 。但我想知道为什么?有什么不对的   char声明? 。因为我要检查'\ n'和EOF字符   为什么整数呢?

EOF的值为-1,类型为INT,因此ch也必须是INT类型。

此外,getchar()的原型是

int getchar(void);

因此必须始终使用整数类型检查getchar()的返回值。

EOF存在固有的混淆,请阅读更多关于它的信息here