也许在这个网站的某个地方有一个答案,但我找不到它的生命。
我需要的是从C ++中的文件中获取所有ASCII字符。这包括\ n(十进制中的ascii 10)和神秘的SUB(十进制中的ascii 26)之类的东西 - 当我尝试读取文件时,它似乎只是作为一个eof。
问题是我不知道在看到新行和诸如此类的东西时没有弄乱的文件中读取的方法。
我希望将所有这些内容都读到字符或uint8_ts的矢量中。
我尝试了几种方法,包括一些方法:Read whole ASCII file into C++ std::string
没有运气。
答案 0 :(得分:3)
如果SUB(0x1a)给你带来问题,那很可能是因为你在文本模式下打开了文件,而不是在Windows(*)中打开了二进制模式。文本模式流允许多个实现定义的事物,二进制模式流不是,比如更改行尾(\n
与\r\n
)的格式,在换行符之前截断尾随空格,或 - 在您的情况下 - 考虑0x1a意味着文件结束。因此,请确保使用二进制模式读取二进制数据。
请注意,二进制模式流可能在流的末尾有额外的零字节。
在7.19.2和#34; Streams",第2-3节中为C99指定了这种流行为。我相信C11和C ++的类似规格,但我不能给你章节和经文。
#include <iostream>
#include <fstream>
#include <sstream>
// ...
std::string filename( "foo.txt" );
std::stringstream sstr;
// It's the std::ios::binary that is making all the difference
std::ifstream in( filename.c_str(), std::ios::binary );
sstr << in.rdbuf();
恭喜,您刚刚将整个文件读入stringstream sstr
。您可以使用sstr.str()
获得string
- 而string
具有许多与std::vector< char >
相同的功能 - 但是djf的解决方案直接阅读vector<char>
效率更高(顺便说一下 也适用于std::string
。)
(*):Linux在文本和二进制模式之间没有区别。
所有这一切,无法保证文件实际上包含ASCII。假设您正在使用Windows,文本文件的默认编码是CP1252,这是与ASCII或ISO 8859-1(Latin-1)或ISO 8859-15(Latin-9)完全不同。欢迎来到文本编码世界。我的建议是使用UTF-8,这是唯一合理的选择......
答案 1 :(得分:2)
我同意everything DevSolar said。我通常会做一些事情:
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
using namespace std;
int main()
{
ifstream f("foo.txt", ios::in | ios::binary);
vector<char> contents(istreambuf_iterator<char>(f), (istreambuf_iterator<char>()));
// process contents ...
}