了解c中的类型转换

时间:2010-03-11 01:44:57

标签: c

我正在关注一本关于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的情况下检查换行?

检查换行符的正确方法是什么?

2 个答案:

答案 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进行比较。