我有一个简单的程序:
#include <cstring>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
cout << "Creating test.txt file..." << endl;
// Writing to file
fstream fWrite;
fWrite.open("./_test_data/test.txt", fstream::out | fstream::trunc);
if (fWrite.fail()) {
cout << "Creating test.txt file failed!" << endl;
fWrite.close();
} else {
fWrite << (char) 0x09 << (char) 0x0A << (char) 0x0B;
fWrite << (char) 0x0C << (char) 0x0D << (char) 0x0E;
fWrite << flush;
fWrite.close();
cout << "test.txt file successfully created." << endl;
}
// Reading created file
cout << "Reading test.txt file..." << endl;
fstream fRead;
fRead.open("./_test_data/test.txt", fstream::in);
if (fRead.fail()) {
fRead.close();
} else {
char character;
while (true) {
fRead >> character;
if (fRead.eof()) {
cout << (int)character << endl;
cout << "EOF detected!" << endl;
break;
}
cout << (int)character << endl;
}
fRead.close();
}
return 0;
}
它应该按顺序09 0A 0B 0C 0D 0E
写入字节,这样就可以了(通过hexdump检查),但是当读取同一个文件时,它会将第一个字节读作0E
(=十进制的14)并且然后是EOF ......
Creating test.txt file...
test.txt file successfully created.
Reading test.txt file...
14
14
EOF detected!
为什么?
答案 0 :(得分:4)
使用fRead.read(&character,1)
代替fRead >> character
。
但您也可以删除if语句中的cout << (int)character << endl;
。
答案 1 :(得分:1)
以二进制模式打开文件:fRead.open("...", fstream::in | fstream::binary);
- 这是为了防止文件层翻译换行序列。
答案 2 :(得分:0)
试试fRead >> std::noskipws
。读取流上的>>
运算符会跳过空格以获取下一个“有趣”数据。考虑像hi there
这样的输入流。一次读取std::string
,您将获得hi
和there
,并忽略空格字符。 Simiarly,一次读到一个角色,你得到了-h-i-t-h-e-r-e-,忽略了空格。
你无法从fRead中读取的字节都被视为空格,因此它们都被忽略了。
fRead.read()
是一个解决方案(也是一个好的解决方案)的原因是它没有格式化输入 - 它不关心空格。
最后,您应该对您的程序进行其他更改:
#include <iostream> // you need this for std::cout and std::endl
iostream
和std::cout
需要std::endl
。
fRead.open(“./_ test_data / test.txt”,fstream :: in | fstream :: binary);
如果要在其中包含任何不可打印的字符,则需要以二进制形式打开测试文件(用于写入和读取)。
答案 3 :(得分:-1)
尝试fstream::in | fstream::binary
。