我正在尝试使用以下代码读取文本文件:
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 ++中它会输入更多垃圾字符。这有什么问题?
答案 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;
}
看,它现在也是
注意,如果您愿意,可以使用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挑战编译器(以及如何使用向量):
#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");
}