我的代码将文件读入 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);
Run Code Online (Sandbox Code Playgroud)
但 bytes_read 是 59,当我检查 readArray 时,它没有任何 \r (0x0D),但文件有。为什么 fread 会跳过所有这些值?有没有一个设置可以控制这个?
问题是在不同的操作系统中换行到底是什么。
在 Linux 上,它是一个 (ascii) 值为 10 的字节,也写为\n.
在 Windows 上,源自 MSDOS,它在文件中是两个\r\n字节: 13 10 ( ),但仅在文件中:
如果由程序读取,\r\n则仅\n在您的变量中,
并且如果将 的内容\n写入文件,则它再次转换为\r\n。
这就是您在这里观察到的,它转换不同的换行符。要关闭此行为,在 fopen 模式下需要额外的“b”(如二进制),例如。r+b代替r+。
在 Linux 上,没有类似的特殊行为,\n 到处都是 \n。
使用“b”也没有错误,但有或没有都不会有什么不同。
顺便说一句,旧的 Mac OS 版本有另一个变体,只有 \r,但这已经是历史了。