尝试编写一个将整数值写入文件的简单程序,然后按照编写顺序读取并显示整数。写入文件的整数是{0,2,...... 18}。以下是代码:
// Example program
#include <iostream>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
using namespace std;
int main()
{
typedef unsigned int uint32_t;
// Write to file
std::ofstream osObj;
string filename = "testFile";
osObj.open(filename.c_str(), std::ofstream::binary);
for (uint32_t i=0; i<10; ++i)
{
uint32_t a = i*2;
osObj.write(reinterpret_cast<const char *>(&a), sizeof(a));
//osObj.write((char *)(&a), sizeof(a));
}
//read from file
std::ifstream isObj;
isObj.open(filename.c_str(), std::ofstream::binary);
if (isObj.fail()) { cout<<"Failed to open file"<<endl; }
for (uint32_t i=0; i<10; ++i)
{
char val[sizeof(uint32_t)];
isObj.read(val, sizeof(val));
uint32_t* valUint = reinterpret_cast<uint32_t *>(val);
cout<<*(valUint)<<endl;
}
return 0;
}
这不会产生预期的结果。我得到以下输出:
62586880
62586880
62586880
62586880
62586880
62586880
62586880
62586880
62586880
62586880
字节顺序是little-endian。我错过了什么?
答案 0 :(得分:1)
您不应将i
添加到valUint
。您只需将一个整数读入val
,因此您刚读取的整数位于valUint
指向的地址。它不是一个整数数组,所以没有理由索引指针。
cout<< *valUint << endl;
更简单的写作方式是:
for (unint32_t i = 0; i < 10; ++i) {
uint32_t val;
isObj.read(reinterpret_cast<char *>&val, sizeof val);
cout << val << endl;
}
此外,您应该在写入循环结束时执行osObj.close()
。文件被缓冲,缓冲区可能没有被刷新。如果您在阅读时检查了错误,您可能会注意到没有从文件中读取任何内容。