【发布时间】:2014-11-19 06:23:09
【问题描述】:
我有一个二进制文件,其中第一行包含我存储到变量中的元数据(例如行 343 列 770 ...)。在此之后,文件的其余部分包含与我还想存储的各种高度相关的短整数(在这段代码中,我只是在测试是否可以获得单个值)。我的代码:
int map[800][800];
string a;
int numrows, numcolumns, bytespp, secondspp, lls, tls, min, max, special;
ifstream infile;
infile.open("usaW70N25D5.dat", ios::binary | ios::in);
infile >>a >> numrows >> a>>numcolumns >> a>> bytespp >>a >> secondspp >>a >> lls >> a>> tls >> a>> min >>a >> max >>a >> special;
int row = 0; max = 0;
cout << numrows << " " << numcolumns << " " << bytespp << " " << secondspp << " " << lls << " " << tls << " " << min << " " << max << " " << special << endl;
short int val = 0;
infile.read((char*)&val,sizeof(infile));
cout << val<< endl;
我得到的错误是:
mapproject.exe 中 0x52ec6e9f (msvcp100d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xfe0cfe0c。
我在尝试读取文件时哪里出错了?我想也许我必须将位置移动一个并尝试:
int spot = infile.tellg(); spot+=1;
infile.seekg(spot);
但这并没有帮助。
【问题讨论】:
-
iostreams 不适用于二进制文件。
ios::binary实际上并不执行二进制 I/O,它所影响的只是换行符转换。所有其他字符编码和语言环境层仍然存在; iostreams 不能在没有方面的情况下运行。而“未格式化”的 I/O 函数(例如read)也不会绕过这些层——它们位于filebuf中,甚至低于未格式化的 I/O。
标签: visual-c++ fstream binaryfiles