在Visual c ++文件读取中垃圾字符的麻烦

时间:2013-10-20 21:15:30

标签: visual-c++ file-io g++

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

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 ++中它会输入更多垃圾字符。这有什么问题?

2 个答案:

答案 0 :(得分:3)

让你的缓冲区更大,然后自己添加终止nul。

答案 1 :(得分: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(只需更改一个单词)

完整演示: see it live on 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挑战编译器(以及如何使用向量):

同样 Live on Coliru

#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");
}