1

我尝试使用带有此代码的 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 行

4

4 回答 4

2

您缺少以下行

file.seekg (0, file.end);

前:

size = file.tellg();
file.seekg (0, file.beg);

如本例所述:http ://www.cplusplus.com/reference/istream/istream/read/

于 2013-03-21T12:46:18.223 回答
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 接口。

于 2013-03-21T12:47:08.663 回答
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这可能是一些实现或系统特定的问题。

于 2013-03-21T12:36:24.563 回答
0

谢谢大家,我发现了错误,只是下面的代码读取了整个文件,问题出在 VS watcher 本身,它只是显示一定数量的数据而不是全文文件。

于 2013-03-24T13:46:57.320 回答