seekp(..)在C++中的奇怪行为

Strange behaviour of seekp(...) in C++

本文关键字:C++ seekp      更新时间:2023-10-16

我有以下代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    fstream in("test.txt");
    in.seekp(10);
    string testStr;
    in >> testStr;
    cout << testStr;
    return 0;
}

文件"test.txt"包含以下文本:

1
2
3
4
5
6
7
8
9
10

当我在Windows上编译这段代码并运行时,我得到的输出=5,当我在Linux Mint 17上编译这篇代码并运行后,我得到输出=6。

为什么?

这只是一个猜测,但在Windows中,编辑器倾向于将换行符写为两个字符:nr,而在linux中只有n。所以你可以在Windows中看到你的文件:

1nr
2nr
3nr
4nr
5nr

在Linux 中

1n
2n
3n
4n
5n
6n

因此,在Windows中,在10移动导引头会在4之后将其放在n上,从而提取下一个5。在Linux中,寻求者会继续6,从而提取它。为了测试我的猜测是否正确,请尝试将Windows文件复制到Linux,反之亦然。

当您指定10个字节时,linux的换行符(\n)和windows的回车符(\r)+换行符(\f)将被计算在内。在Windows上,试试这个:

in.seekp(10*3);

类似地,在Linux中,

in.seekp(10*2);

但是,相反,如果您读取整行10次并放弃输入,那会更好,以防每行有一个以上的字符