C fread省略0x0D

时间:2015-12-01 18:32:59

标签: c fread

我的代码将文件读入unsigned char *数组。该文件实际上是一个文本文件,其“正常”行结尾为0x0D,0x0A,长度为64字节。

FILE * inputFile = fopen(sInfile.c_str(), "r+");
unsigned char * readArray = (unsigned char *)malloc(sizeof(unsigned char)*readSize); //readSize=64
int bytes_read = fread(readArray, sizeof(unsigned char), readSize, inputFile);

但是bytes_read是59,当我检查readArray时,它没有任何\ r \ n(0x0D)但是文件没有。 为什么跳过所有这些价值?是否有控制此功能的设置?

1 个答案:

答案 0 :(得分:4)

问题在于,在不同的操作系统中,换行符正是如此 在Linux上,它是一个带有(ascii)值10的字节,也写为\n

在Windows上,源自MSDOS,文件中的两个字节:13 10(\r\n),但仅限于文件中:
如果程序读取,则\r\n变量中只有\n 如果将\n的内容写入文件,则会再次转换为\r\n

这就是你在这里观察的内容,它可以转换不同的换行符。要关闭此行为,需要额外的" b" (如二进制中)在fopen模式中是必需的,例如。 r+b代替r+

在Linux上,没有类似的特殊行为,\ n无处不在.n 使用" b"没有错误。也是,但无论有没有,它都会有所不同。

顺便说一下,旧的Mac OS版本有另一种变体,只有\ r \ n,但这是历史。