C++ primer 5th edition Chapter 17.5.3 fstream 不换行
C++ primer 5th edition Chapter 17.5.3 fstream doesn't put new line
这是 C++ primer 第 5 版 一书第 17 章 (17.5.3) 的示例代码。
int main(void) {
fstream inOut("test.txt", fstream::ate | fstream::in | fstream::out);
if (!inOut)
{
cerr << "Unable to open file!" << endl;
return EXIT_FAILURE;
}
auto end_mark = inOut.tellg();
inOut.seekg(0, fstream::beg);
size_t cnt = 0;
string line;
while (inOut && inOut.tellg() != end_mark && getline(inOut, line))
{
cnt += line.size() + 1;
auto mark = inOut.tellg();
inOut.seekg(0, fstream::end);
inOut << cnt;
if (mark != end_mark)
{
inOut << " ";
}
inOut.seekg(mark);
}
inOut.seekg(0, fstream::end);
inOut << "\n";
return 0;
}
文件test.txt
的内容是:
abcd
efg
hi
j
<This is a blank new line>
重点是,如果此文件以空行结尾,则此代码会按预期工作。换句话说,它会将文件更改为:
abcd
efg
hi
j
5 9 12 14
<This is a blank new line>
但是,如果文件没有以新的空白行结尾,它将输出如下:
abcd
efg
hi
j5 9 12
请注意,此文件不以新行结尾。
我的问题是空白的新行在哪里?毕竟有代码
inOut << "\n";
无论如何都应该加一个新的空行。哪里错了?
问题是到达文件末尾时设置了流的坏位。如果你加上
inOut.clear();
在最后的 inOut << "\n" 之前,换行符按预期写入,尽管没有换行符的行的长度继续不添加。
这是 C++ primer 第 5 版 一书第 17 章 (17.5.3) 的示例代码。
int main(void) {
fstream inOut("test.txt", fstream::ate | fstream::in | fstream::out);
if (!inOut)
{
cerr << "Unable to open file!" << endl;
return EXIT_FAILURE;
}
auto end_mark = inOut.tellg();
inOut.seekg(0, fstream::beg);
size_t cnt = 0;
string line;
while (inOut && inOut.tellg() != end_mark && getline(inOut, line))
{
cnt += line.size() + 1;
auto mark = inOut.tellg();
inOut.seekg(0, fstream::end);
inOut << cnt;
if (mark != end_mark)
{
inOut << " ";
}
inOut.seekg(mark);
}
inOut.seekg(0, fstream::end);
inOut << "\n";
return 0;
}
文件test.txt
的内容是:
abcd
efg
hi
j
<This is a blank new line>
重点是,如果此文件以空行结尾,则此代码会按预期工作。换句话说,它会将文件更改为:
abcd
efg
hi
j
5 9 12 14
<This is a blank new line>
但是,如果文件没有以新的空白行结尾,它将输出如下:
abcd
efg
hi
j5 9 12
请注意,此文件不以新行结尾。 我的问题是空白的新行在哪里?毕竟有代码
inOut << "\n";
无论如何都应该加一个新的空行。哪里错了?
问题是到达文件末尾时设置了流的坏位。如果你加上
inOut.clear();
在最后的 inOut << "\n" 之前,换行符按预期写入,尽管没有换行符的行的长度继续不添加。