#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字符为什么整数呢?
答案 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)
您应该使用<...>
代替"..."
来包含系统标头文件,例如stdio.h
或stdlib.h
。
您应该检查fopen
的返回值是否存在错误。
fgetc()
的返回类型为int
,而不是char
。
您的上一次线路调整存在逻辑缺陷。在do {} while
循环之前,ch
是EOF,它永远不会是'\n'
。如果在上一个'\n'
之后有任何字符,则需要另一个标记来记住,并在do {} while
循环中正确设置。
以下是您的代码的固定版本,更灵活一点:
#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