1

我正在尝试使用以下代码读取文本文件:

void function readfile(char *inputfile) {
istream is;
int filesize = 0;

is.open(inputfile);
if (!is.is_open()) {
 return;
}
is.seekg(0, ios::end);
filesize = (int)is.tellg();
is.seekg(0, ios::beg);

char *buf = new char[filesize];
is.read(buf, filesize);
is.close();

cout << buf << endl;

delete[] buf;
return;
}

虽然在 g++ (mac / macports) 中它可以正常工作(将所有内容放入动态分配的 char* 数组中),但在 Visual Studio C++ 2010 中,我得到了这种类型的持续错误:Debug assertion failed: (unsigned)(c+1) <= 256, file isctype.c.

问题是它打开文件但找不到终止分隔符,所以当它到达 eof 时,它开始在其他地方读取(垃圾字符)。使用cout << buf;我可以看到该文件在 mac 中被正确读取,但在 Visual c++ 中它键入更多垃圾字符。这里有什么问题?

4

2 回答 2

3

使您的缓冲区变大并自己添加终止的 nul 。

于 2013-10-20T21:18:18.673 回答
1

让 C++ 标准库为您完成工作:

void readfile(const char *inputfile) {
    std::ifstream is(inputfile);
    std::string buf(std::istreambuf_iterator<char>(is), {});
    std::cout << buf << std::endl;
}

看,现在也是

  • 异常安全
  • 正确处理嵌入的 NUL 字符

请注意,如果您愿意,当然可以使用vector而不是string(只需更改一个词)

完整演示:在 Coliru 上现场观看

#include <fstream>
#include <iostream>
#include <iterator>

void readfile(const char *inputfile) {
    std::ifstream is(inputfile);
    std::string buf(std::istreambuf_iterator<char>(is), {});
    std::cout << buf << std::endl;
}

int main()
{
    readfile("main.cpp");
}

更新C++11 挑战编译器(并展示如何使用向量):

住在科利鲁

#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>

void readfile(const char *inputfile) {
    std::ifstream is(inputfile);
    std::istreambuf_iterator<char> f(is), l;
    std::vector<char> buf(f, l);

    std::cout.write(buf.data(), buf.size());
}

int main()
{
    readfile("main.cpp");
}
于 2013-10-20T22:28:38.207 回答