2013-03-20 75 views
1

我有一个带有一些示例文本的文本文件“hello.txt”。当我在十六进制编辑器中打开文件时,可以看到换行符的\ r \ n字符。但是当我用getc()在C程序中读取文件时,\ r某种程度上消失了,我只能看到\ n字符。getc()不返回carrige返回' r'字符

我试图在网上搜索和在stackoverflow但没有运气。

hello.txt的

Sample 
File 

代码:

#include <stdio.h> 

int main() 
{ 
    FILE *fp; 
    fp = fopen("hello.txt", "r"); 

    int character = 0; 

    while((character = getc(fp)) != EOF) 
    { 
     printf("%.2X ", character); 
    } 

    return 0; 
} 

输出:从十六进制编辑器看到

53 61 6D 70 6C 65 0A 46 69 6C 65 

文件:

53 61 6D 70 6C 65 0D 0A 46 69 6C 65 

可以看出,使用getc()函数时,0D0A仅输出为0A。

为什么getc()避免'\ r'字符?我怎样才能得到它返回给定文件中的EXACT数据,即\ r \ n没有任何转换为​​\ n?

+1

尝试在二进制模式下打开它,使用''rb“'来获得''\ r''s。 – 2013-03-20 15:46:56

+0

谢谢。有效 ! :) – 2013-03-20 15:52:50

回答

5

在Windows上,您必须在二进制模式打开文件:

fp = fopen("hello.txt", "rb"); 

默认,文本模式,转换的DOS/Windows行结束\r\n成单个字符。

+0

谢谢。我一直在看着getc()。我甚至没有怀疑读取模式会影响到这一点。 – 2013-03-20 15:54:36

2

如果在文本模式下打开文件fp = fopen("hello.txt", "r");,则0x0D字符如果预设0x0A字符将被忽略。

2

尝试fp = fopen("hello.txt", "rb"); - 'b'处于开放模式,文件以“测试模式”打开,该模式将行结束符(取决于平台)转换/标准化为简单的\n