C 文件长度的计算不需要';行不通
我只是想计算文件中的行数。同样的结果也不会返回给我 我可能犯的错误是什么 环境:AIX和编译器:CC 谢谢 编辑:我的程序编译成功,但在执行.Out文件时,没有显示任何内容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;
虽然我得到了答案。幸亏我有变化charch至int 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
您的最后一行自适应中存在逻辑缺陷。在beforedo{}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);