为什么 fstream::tellg() 返回值会因输入文本文件中的换行符数而增大,当文件针对 Windows (r
Why fstream::tellg() return value is enlarged by the number of newlines in the input text file, when file is formated for Windows ( )?
程序打开输入文件并多次打印当前读/写位置。
如果文件格式为""作为换行符,则值符合预期:0、1、2、3。
另一方面,如果换行符是 '\r',则似乎经过一些读取后,所有 tellg(( 调用返回的当前位置都会被文件中换行符的数量偏移 - 输出为:0、5、6、7。
所有返回值都增加 4,这是示例输入文件中的换行符数。
#include <fstream>
#include <iostream>
#include <iomanip>
using std::cout;
using std::setw;
using std::endl;
int main()
{
std::fstream ioff("su9.txt");
if(!ioff) return -1;
int c = 0;
cout << setw(30) << std::left << " Before any operation " << ioff.tellg() << endl;
c = ioff.get();
cout << setw(30) << std::left << " After first 'get' " << ioff.tellg() << " Character read: " << (char)c << endl;
c = ioff.get();
cout << setw(30) << std::left << " After second 'get' " << ioff.tellg() << " Character read: " << (char)c << endl;
c = ioff.get();
cout << setw(30) << std::left << " Third 'get' " << ioff.tellg() << "ttCharacter read: " << (char)c << endl;
return 0;
}
输入文件长 5 行(有 4 个换行符(,内容如下:
-------------------------------------------
abcd
efgh
ijkl
--------------------------------------------
输出 ((:
Before any operation 0
After first 'get' 1 Character read: a
After second 'get' 2 Character read: b
Third 'get' 3 Character read: c
输出 (\r(:
Before any operation 0
After first 'get' 5 Character read: a
After second 'get' 6 Character read: b
Third 'get' 7 Character read: c
请注意,字符值是直接读取的。
第一个也是最明显的问题是,你为什么期望任何tellg
的结果转换为整体类型。 结果的唯一定义用途 tellg
是作为seekg
的后期论据;他们没有定义数字意义何去何从。
话虽如此:在Unix和Windows实现中,他们将实际上总是对应于文件中的物理位置。 这意味着他们将拥有如果文件以二进制模式打开,则具有某种意义;下例如,Windows文本模式(默认(映射两者字符序列0x0D,0x0A文件中的单个字符'n'
,并将单个字符0x1A视为遇到文件结束。 (二进制和文本模式为在 Unix 下完全相同,所以事情似乎经常在那里工作,甚至当它们无法保证时。
我可以补充一点,我无法使用 MSC++ 重现您的结果。并不是说这意味着什么;正如我所说,唯一的要求对于tellg
是返回值可以在seekg
中使用回到原地。 (另一个问题可能是你如何创建了文件。 他们中的一个可能以 UTF-8 开头吗?例如,BOM 的编码,而另一个不是?
相关文章:
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- vcruntime.h 从 Windows 包含文件夹中丢失?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 如何在Windows内核中获取文件大小
- Qt自动生成的.rc文件无法打开包含文件'windows.h'
- MinGW GCC通配符编译所有文件(Windows)
- QTCreator G .EXE:致命错误:无输入文件(Windows)
- 切割和粘贴后监视文件(Windows shell扩展?)
- 如何读取目录中包含的所有文件 (WINDOWS)
- WebCam预览和捕获到文件(Windows)
- 从 c++ 中的当前目录复制文件(Windows API)
- 我可以将一个可执行文件与另一个可执行文件(Windows 服务程序)组合在一起,并将该程序作为逻辑服务运行吗?
- C++锁定文件Windows阻止模式
- 正在将明文AES 128密钥导出到缓冲区/文件Windows Crypto API c++
- 有效删除文件Windows c++