我真的没有在谷歌找到满意的答案和C ++中的I / O有点棘手。如果可能的话,我想按块将文本文件读入矢量。唉,我无法弄清楚如何。我甚至不确定,如果我的无限循环将在所有可能性中中断,因为I / O很棘手。所以,我能够弄清楚的最好的方法是:
char buffer[1025]; //let's say read by 1024 char block
buffer[1024] = '\0';
std::fstream fin("index.xml");
if (!fin) {
std::cerr << "Unable to open file";
} else {
while (true) {
fin.read(buffer, 1024);
std::cout << buffer;
if (fin.eof())
break;
}
}
请注意第二行'\ 0'。这不奇怪吗?我能做得更好吗?我可以将数据读入向量而不是char数组吗?是否适合直接读入矢量?
感谢您的回答。
PS。通过大块阅读确实有意义。这段代码很短,但我将它存储在循环缓冲区中。
答案 0 :(得分:4)
你应该没事做以下
vector<char> buffer (1024,0); // create vector of 1024 chars with value 0
fin.read(&buffer[0], buffer.size());
向量中的元素保证连续存储,因此这应该有效 - 但是您应该确保向量永远不会为空。我最近在这里问了一个类似的问题 - 从标准Can I call functions that take an array/pointer argument using a std::vector instead?
中查看具体细节的答案答案 1 :(得分:0)
std::ifstream fin("index.xml");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();
正是你需要的。
答案 2 :(得分:0)
最近,我遇到了同样的问题。我使用读取和计数功能来解决它。它运作良好。这是代码。
vector<string> ReadFileByBlocks(const char* filename)
{
vector<string> vecstr;
ifstream fin(filename, ios_base::in);
if (fin.is_open())
{
char* buffer = new char[1024];
while (fin.read(buffer, 1024))
{
string s(buffer);
vecstr.push_back(s);
}
// if the bytes of the block are less than 1024,
// use fin.gcount() calculate the number, put the va
// into var s
string s(buffer, fin.gcount());
vecstr.push_back(s);
delete[] buffer;
fin.close();
}
else
{
cerr << "Cannot open file:" << filename << endl;
}
return vecstr;
}