我的代码将文件读入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)但是文件没有。 为什么跳过所有这些价值?是否有控制此功能的设置?
答案 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,但这是历史。