在c ++中,seekg似乎包含了cr chars,但是read()会删除它们

时间:2013-03-26 11:50:07

标签: c++ newline ifstream

我目前正在尝试将文件内容读入char数组。

例如,我在char数组中有以下文本。 42个字节:

{
    type: "Backup",
    name: "BackupJob"
}

此文件是在Windows中创建的,我使用的是Visual Studio c ++,因此没有操作系统兼容性问题。

然而,执行以下代码,在for循环完成时,我得到Index:39,在10之前没有显示13。

// Create the file stream and open the file for reading
ifstream fs;
fs.open("task.txt", ifstream::in);

int index = 0;
int ch = fs.get();
while (fs.good()) {
    cout << ch << endl;
    ch = fs.get();
    index++;
}

cout << "----------------------------";
cout << "Index: " << index << endl;
return;

但是,当尝试创建一个char数组时,文件的长度,按照下面的方式读取文件大小会导致3个额外的CR字符归因于总文件大小,因此length等于42,这是用狡猾的字节添加拧紧数组的末尾。

// Create the file stream and open the file for reading
ifstream fs;
fs.seekg(0, std::ios::end);
length = fs.tellg();
fs.seekg(0, std::ios::beg);

// Create the buffer to read the file
char* buffer = new char[length];
fs.read(buffer, length);
buffer[length] = '\0';
// Close the stream
fs.close();

使用十六进制查看器,我确认该文件确实包含文件中的CRLF(13 10)个字节。

获取文件的结尾以及get()和read()方法实际返回的内容似乎存在差异。

有人可以帮忙吗?

干杯, 贾斯汀

1 个答案:

答案 0 :(得分:4)

您应该以二进制模式打开文件。这将停止读取CR。

fs.open("task.txt", ifstream::in|ifstream::binary);