我有以下简单的代码,它将文本文件的内容读入字符数组:
const char* name = "test.txt";
std::cout << "Loading file " << name << std::endl;
std::ifstream file;
file.open(name);
file.seekg (0, std::ios::end);
int length = file.tellg();
std::cout << "Size: " << length << " bytes" << std::endl;
file.seekg (0, std::ios::beg);
char* buffer = new char[length];
file.read(buffer,length);
file.close();
std::cout.write(buffer,length);
Run Code Online (Sandbox Code Playgroud)
但是,似乎ifstream从文件读取错误的字符数:每行1个额外的字符.我搜索了网络,看起来在win7文本文件中除了每行末尾的换行符(\n)之外还有回车符号(\ r).但是,流以某种方式看不到这些\ r,但仍然使用文件中的原始符号数,从文件末尾读取额外的字节.有可能以某种方式解决这个问题吗?
如果它有帮助:我使用MinGW编译器和Windows 7 64位.
您可能希望以二进制模式打开文件:
file.open(name, ios_base::in | ios_base::binary);
Run Code Online (Sandbox Code Playgroud)
否则,标准库会将每个Windows换行符(CR + LF)转换为单个换行符\n.
这意味着您可以从文件中读取的字符数与文件的大小不同.当你打电话时read(),它会尽可能多地读取字符.如果它无法读取您请求的字符数,则会设置流的failbit.