无法一次从二进制文件中读取一个 int
Can't Read One Int at a Time from Binary File
我正在学习C++ IO 操作,但在读取二进制文件时遇到了问题。我用 100 个随机值初始化一个数组,并将数组中的值写入.bin
文件。我想我把那部分放下来了——出于某种原因,虽然我的.bin
文件大小是 1600 字节而不是 400 字节——但我正在努力读取这些值。
我认为可以通过遍历包含读取值的memblock
数组来按 int 读取 int,但我的控制台输出显示一个随机数,后跟一堆零。我将不胜感激你的指导。
// reading a binary file int by int
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
using namespace std;
int main () {
FILE * pFile;
streampos size;
int * memblock;
srand(time(NULL));
int array[100];
//data to write initially stored in array
for (int i=0;i<100;i++){
array[i]=rand()%100;
}
pFile = fopen("writebinary.bin","wb");
fwrite(array,sizeof(int),sizeof(array),pFile);
fclose(pFile);
ifstream readFile("writebinary.bin",ios::binary | ios::ate);
if (readFile.is_open()){
size = readFile.tellg();
//allocate memory to read file contents
memblock = new int[size];
readFile.seekg(0,ios::beg);
for (int i=0;i<100;i++){ //100 because there are 100 ints,I'm assuming 32 bits are read a at a time from writebinary.bin
readFile.read((char*)memblock,sizeof(int));
}
readFile.close();
}
else {
cout << "can't open file " << endl;
}
for (int i=0;i<100;i++){
cout << memblock[i] << endl;
}
return 0;
}
好吧,对于您的第一期,sizeof(array)
是 400,因为您的 100 个整数的数组占用 400 个字节,而sizeof(int)
是 4,因为 int 是 32 位。这就是您获得 1600 字节输出文件的原因。您在其他任何地方都对数字 100 进行硬编码;您还需要在此处对其进行硬编码,或使用sizeof(array)/sizeof(int)
.
其次,使用 istream::read 时不需要迭代。它需要要读取的缓冲区大小(以字节为单位(。所以readFile.read((char *)memblock,sizeof(array));
只做一次。
不过,另一方面,您的代码是 C 风格编程和 C++ iostreams 编程的大杂烩。为什么使用 fopen/fwrite/fclose?你应该使用 std::ofstream 并使用写入成员函数,类似于你的readFile.read
。
相关文章:
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- 通过 char* 缓冲区读取 int 的行为是不同的,无论是正数还是负数
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- 从 ifstream 读取 int 到 2-D 动态数组
- 使用 c++ 时从二进制文件中读取 int 不正确
- C++ 从文件中读取 int,每个数字用逗号分隔
- 使用iStream从文件中读取int数据
- openssljava到c++读取int问题
- 在 c++ 中从向量中读取 int 值
- 从第 3 位开始读取 int 的最快方法?
- C++读取 int 和字符串,可能同时读取
- 在C++中一次一行地从文本文件中读取int(好的字符,然后转换)时出现问题
- 读取int中的数字并对其进行计数
- 从十六进制数组读取 Int
- 从STDIN读取int时的奇怪行为
- c/c++scanf/cin从多行读取int
- 当循环失败时,当读取int和字符串C++时
- 如何在写入/读取int值时触发函数调用
- 从istream中读取int,检测溢出
- 每行读取int并显示百分比