我尝试使用带有此代码的vc ++读取整个文本文件
ifstream file (filePath, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = (long)file.tellg();
char *contents = new char [size];
file.seekg (0, ios::beg);
file.read (contents, size);
file.close();
isInCharString("eat",contents);
delete [] contents;
}
但是它不能获取所有整个文件,为什么以及如何处理这个?
注意:文件大小为1.87 MB和39854行
答案 0 :(得分:2)
您缺少以下一行
file.seekg (0, file.end);
之前:
size = file.tellg();
file.seekg (0, file.beg);
如本例所示:http://www.cplusplus.com/reference/istream/istream/read/
答案 1 :(得分:2)
另一种方法是:
std::string s;
{
std::ifstream file ("example.bin", std::ios::binary);
if (file) {
std::ostringstream os;
os << file.rdbuf();
s = os.str();
}
else {
// error
}
}
或者,您可以使用C库函数fopen,fseek,ftell,fread,fclose。在某些情况下,c-api可以更快,但代价是更多的STL接口。
答案 2 :(得分:0)
你真的应该养成阅读文档的习惯。记录ifstream::read有时不会读取所有字节,
The number of characters successfully read and stored by this function
can be accessed by calling member gcount.
因此,您可以通过查看file.gcount()
和file.rdstate()
来调试问题。此外,对于此类大型读取,使用(在某些显式循环中)istream::readsome成员函数可能更相关。 (我建议用例如64K字节的块来阅读。
PS可能是某些实现或系统特定问题。
答案 3 :(得分:0)
谢谢大家,我发现错误在哪里, 只需下面的代码读取整个文件, 问题出在VS观察者本身,它只是显示一定数量的数据而不是全文文件。