我正在尝试将二进制文件解释为一系列整数,并将值读取为向量。但是,行[[ifs >> n;始终返回0,并且eof始终为false,文件位置不会更新。如果我将类型更改为char,那么它可以工作,但这不是想要实现的。如何使代码按我的意愿工作?
int readAsNumber(const char* fileName, vector <int> &content)
{
ifstream ifs;
int n;
ifs.open(fileName, ifstream::in | ifstream::binary);
while (ifs.eof() == false) // Never terminates
{
ifs >> n; // Always sets n = 0
content.push_back(n); // Saves 0
}
ifs.close();
return 0;
}
>>
读取输入并将其解释为文本。
如果文件包含原始二进制数据,您还需要read作为原始数据:int value;
while (ifs.read(reinterpret_cast<char*>(&value), sizeof value))
content.push_back(value);
请记住,这样存储原始二进制数据是不可移植的,并且实际上不建议这样做。
ifs >> n
尝试将整数读取为文本-模式对此无效。(binary
标志或多或少只影响换行符的解释。)ifs >> n
失败时,ifs
进入错误状态,并且永远不会到达终点。如果您使用更合适的格式while (ifs >> n)
,您将(可能)立即失败并且永远不会进入循环。
如果您不想阅读文本,请不要使用格式化的提取运算符,而要使用二进制输入功能。
例如,
void readAsNumber(const std::string& fileName, vector <int> &content)
{
ifstream ifs(fileName, ifstream::binary);
int n = 0;
while (ifs.get(reinterpret_cast<char*>(&n), sizeof(n))
{
content.push_back(n);
}
}