无法使用 fstream 输出最后一行
cannot output the last row with fstream
void reverse_output(string s, fstream& file, streamoff initial_pos)
{
const char* a = s.c_str();
file.seekp(initial_pos, ios::beg);
for (int i = s.length() - 1; i >= 0; i--)
{
file.put(a[i]);
}
}
int main()
{
string file_name = "E:\WorkSpace\ConsoleApplication2\Debug\2.txt";
fstream file;
file.open(file_name.c_str());
string row;
streamoff pos = 0;
while (getline(file, row))
{
reverse_output(row, file, pos);
file.put('\n');
pos = file.tellp();
file.seekg(pos, ios::beg);
}
file.close();
return 0;
}
我想编写一个程序来反转文件的每一行。
假设一个文件包含:
123456
qwe
将转换为同一文件包含:
654321
ewq
我写了上面的代码,但它们对最后一行不起作用。
我怀疑
while (getline(file, row))
是主要原因。谁能帮帮我,告诉我真正的原因?
您使用 while (std::getline(file, row))
没问题。您的问题是文件的最后一行不包含换行符!读取最后一行时,它的结尾是通过触摸文件的结尾来确定的。当流到达文件末尾时,标志 std::ios_base::eofbit
被设置,即 file.eof()
产生 true
.
您要做的下一个操作是尝试使用 file.seekp(...)
搜索流。对 seekp()
的调用会在文件上创建一个 std::ostream::sentry
,当 file.good()
为 false
时,它将转换为 false
。设置 std::ios_base::eofbit
会导致 file.good()
变为 false
。当 sentry
对象转换为 false
时,搜索操作失败并设置 std::ios_base::failbit
。
解决该问题的最简单方法是在 while
循环开始时重置 std::ios_base::eofbit
:
while (getline(file, row))
{
file.clear();
// ...
}
由于从 std::getline()
返回的流转换为 true
,因此只能设置 std::ios_base::eofbit
:如果设置了 std::ios_base::failbit
或 std::ios_base::badbit
,流将转换为 false
.
void reverse_output(string s, fstream& file, streamoff initial_pos)
{
const char* a = s.c_str();
file.seekp(initial_pos, ios::beg);
for (int i = s.length() - 1; i >= 0; i--)
{
file.put(a[i]);
}
}
int main()
{
string file_name = "E:\WorkSpace\ConsoleApplication2\Debug\2.txt";
fstream file;
file.open(file_name.c_str());
string row;
streamoff pos = 0;
while (getline(file, row))
{
reverse_output(row, file, pos);
file.put('\n');
pos = file.tellp();
file.seekg(pos, ios::beg);
}
file.close();
return 0;
}
我想编写一个程序来反转文件的每一行。
假设一个文件包含:
123456
qwe
将转换为同一文件包含:
654321
ewq
我写了上面的代码,但它们对最后一行不起作用。 我怀疑
while (getline(file, row))
是主要原因。谁能帮帮我,告诉我真正的原因?
您使用 while (std::getline(file, row))
没问题。您的问题是文件的最后一行不包含换行符!读取最后一行时,它的结尾是通过触摸文件的结尾来确定的。当流到达文件末尾时,标志 std::ios_base::eofbit
被设置,即 file.eof()
产生 true
.
您要做的下一个操作是尝试使用 file.seekp(...)
搜索流。对 seekp()
的调用会在文件上创建一个 std::ostream::sentry
,当 file.good()
为 false
时,它将转换为 false
。设置 std::ios_base::eofbit
会导致 file.good()
变为 false
。当 sentry
对象转换为 false
时,搜索操作失败并设置 std::ios_base::failbit
。
解决该问题的最简单方法是在 while
循环开始时重置 std::ios_base::eofbit
:
while (getline(file, row))
{
file.clear();
// ...
}
由于从 std::getline()
返回的流转换为 true
,因此只能设置 std::ios_base::eofbit
:如果设置了 std::ios_base::failbit
或 std::ios_base::badbit
,流将转换为 false
.