同一文件流中的fread和fgetc不工作
fread and fgetc in the same file stream not working
我有一个二进制文件,其重复格式如下:6个浮点值+3个无符号字符(字节`,0到255之间的整数值)值。
我是这样分析的:
FILE *file = fopen("file.bin", "r");
bool valid = true;
while(!feof(file)) {
float vals[6];
valid = valid && (fread((void*)(&vals), sizeof(float), 6, file) == 6);
unsigned char a,b,c;
a = fgetc(file); b = fgetc(file); c = fgetc(file);
(...)
}
这在前30次迭代中效果良好,但在那之后它就停止了解析(在文件结束之前)。
可能出了什么问题?
我还尝试使用解析unsigned char
字节
fread((void*)&(a), sizeof(unsigned char), 1, file);
它只是简单地停止解析(在文件结束之前)。
您和C标准库在文件结尾的位置上存在意见分歧。ASCII字符EOF(对于DOS/Windows:十进制26,十六进制1A,又名Ctrl+Z,对于Unix/Linux:十进制4,十六进制04,又名Ctrl+D)是一个控制字符,意思是"文件结尾"。还有文件系统元数据存储的文件长度。
C stdio函数可以在几种模式下操作:文本、默认、二进制,这些模式控制几种行为:
- 换行翻译(实现定义):在文本模式下启用,在二进制模式下禁用,默认值:
- 文件结尾:实现定义,但通常是文本模式下的EOF字符,二进制模式下的文件系统文件长度,默认值:
由于您的文件包含二进制数据,您应该通过在模式字符串中使用"b"
将二进制模式强制为fopen
,例如
FILE* file = fopen("file.bin", "rb");
这样做时,值为26的字符将被视为其他任何字节,并失去其"EOF"的含义。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 同一文件流中的fread和fgetc不工作