C 文件长度的计算不需要';行不通

C 文件长度的计算不需要';行不通,c,file-io,C,File Io,我只是想计算文件中的行数。同样的结果也不会返回给我 我可能犯的错误是什么 环境:AIX和编译器:CC 谢谢 编辑:我的程序编译成功,但在执行.Out文件时,没有显示任何内容 虽然我得到了答案。幸亏我有变化charch至int ch。但我想知道为什么?char声明中有什么错误。我要检查“\n”和EOF字符,那么为什么是整数呢?这是一个粗制滥造的镜头,但改变了行 #include "stdio.h" #include "stdlib.h" int main() { FILE *fp;

我只是想计算文件中的行数。同样的结果也不会返回给我

我可能犯的错误是什么

环境:AIX和编译器:CC

谢谢

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


虽然我得到了答案。幸亏我有变化charchint ch。但我想知道为什么?char声明中有什么错误。我要检查“\n”和EOF字符,那么为什么是整数呢?

这是一个粗制滥造的镜头,但改变了行

#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;
}


这是适当的。
fgetc
的返回类型是
int
,而不是
char
问题在于AIX上的
char
实际上是
无符号char

fgetc()
返回一个
int
值,并且-1(通常)用于表示EOF。但是,由于
无符号字符
不能为负(EOF变为255),因此比较
ch!=EOF
将始终为真,这将导致无休止的循环

定义
intch修复了问题;顺便说一句,如果您使用
-Wall
(显示所有编译器警告),这应该在编译过程中显示出来

  • 您应该使用
    而不是
    “…”
    来包括系统头文件,例如
    stdio.h
    stdlib.h

  • 您应该检查
    fopen
    的返回值是否存在可能的错误

  • fgetc()
    的返回类型是
    int
    ,而不是
    char

  • 您的最后一行自适应中存在逻辑缺陷。在before
    do{}while
    循环之后,
    ch
    是EOF,它永远不会是
    '\n'
    。您需要另一个标志来记住最后一个
    '\n'
    之后是否有任何字符,并在
    do{}while
    循环中正确设置它

  • 下面是您的代码的固定版本,稍微灵活一些:

    int ch;
    
    我有零钱;到int ch。但我想知道为什么?这有什么问题吗 字符声明。因为我要检查“\n”和EOF字符 那为什么是整数呢

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

    此外,getchar()的原型是

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


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

    它实际上是不打印任何内容,还是打印不正确的结果?我得到了正确的行数+1。这部分:
    ch!='\n'
    在最后一个
    if
    没有用–前面的
    do-而
    ch==EOF
    终止,因此在
    if
    条件变量
    ch
    中是
    EOF
    并且从不
    \n
    @merlin2011:不打印anything@CiaPan:我保留的最后一个条件,因为最后一行不会以“\n”结尾(换行符)因此检查。尝试将
    \n
    添加到printf。
    printf(“%d\n”,noOfLines);
    当程序终止时,可能你的操作系统没有刷新标准输出。@R Sahu:我想你的疯狂尝试对我来说很有用。你会想知道为什么它会这样工作吗?无论如何,非常感谢。@thinkinbee,这一定会有帮助,谢谢你的解释:-)
    int ch;
    
    #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
    
    int getchar(void);