我正在关注一本关于c的书,我找到了一些代码,这些代码读取了包含3行文本的文件。
#include <stdio.h>
int main (int argc, const char * argv[]) {
FILE *fp;
int c;
fp = fopen( "../../My Data File", "r" );
if ( NULL == fp ) {
printf( "Error opening ../My Data File" );
} else {
while ( (c = fgetc( fp )) != EOF )
putchar ( c );
fclose( fp );
}
return 0;
}
我尝试修改它,检测每一行并通过进行这些修改来打印当前行号。
int line = 1;
while ( (c = fgetc( fp )) != EOF ){
if (c == '\n'){
printf(" LINE %d", line);
putchar( c );
line++;
}
else {
putchar ( c );
}
}
但它无法打印#行,直到我将变量c的类型更改为char。有没有办法在仍然使用c作为int的情况下检查换行?
检查换行符的正确方法是什么?
答案 0 :(得分:1)
由于您编写循环的方式,您的代码会在打印'\n'
之前在行尾打印行号。否则,您的代码应该可以正常工作。
如果您希望代码在开头打印行号,您可以执行类似(未经测试)的操作:
int line_num_printed = 0; /* indicating if we printed a line number */
int line = 1;
while ((c = fgetc(fp)) != EOF) {
if (!line_num_printed) {
printf("LINE %d: ", line);
line_num_printed = 1;
}
putchar(c);
if (c == '\n'){
line++;
line_num_printed = 0;
}
}
如果还有其他“不起作用”的东西,你应该发布完整的代码并告诉我们什么不起作用。
编辑:检查换行符的正确方法是针对'\n'
进行测试。如果角色来自文件,您还应确保以文本模式打开文件,即b
的第二个参数中没有fopen()
。
此外,您希望c
的类型为int
,而不是char
。这是因为在C中,EOF
是一个较小的负数,如果char
是无符号的,则将其与负数进行比较会将EOF
的值转换为正值(等于{ {1}}最有可能的)。因此,您不将EOF + UCHAR_MAX + 1
更改为c
类型。如果您这样做,即使char
返回c != EOF
,比较结果fgetc()
也可能是假的。
答案 1 :(得分:0)
通常新行('\ n')的整数代码是13.所以你可以这样做(如果(c == 13)),还要注意windows文件使用2个字符来定义一个新行'\ r'和'\ n'。 '\ r'的整数字符是10.但基本上是的,你可以将'c'保存为int,只需与13进行比较。