seekp(..)在C++中的奇怪行为
Strange behaviour of seekp(...) in C++
我有以下代码:
#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次并放弃输入,那会更好,以防每行有一个以上的字符
相关文章:
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 使用 seekp() 和 tellg() 进行数据处理
- 使用 tellg() 和 seekp() 覆盖文件
- seekg 和 seekp :seek(streampos pos) 和 seek(streamoff off, ios
- 与fstream一起seekp和seekg
- 使用seekg和seekp得到错误的输出
- 使用Seekp进行IO二进制写入;下移线条
- 如何在c++中使用seekg和seekp附加到文件,而不使用ios:app标志
- Seekp函数在Xcode、C++中无法识别
- C ++ fstream 写入不适用于没有 seekg 和 seekp 的二进制文件
- 在处理二进制文件时了解 Seekg() 和 seekp()
- seekp() 位置在文件中新行的开头
- C++ Seekp multiple times
- Seekp 和 seekg 不适用于 Fstream
- seekp(..)在C++中的奇怪行为
- "fseek"、"lseek"、"seekg"、"seekp"有什么区别?
- 使用 fstream 创建文件,如果它不存在使用 seekp/seekg?
- 写入函数不使用seekp值
- 理解以下c++代码有困难.(seekp)
- 登录到文件后使用tell和seekp设置块大小是否合理?