为什么 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 ( )?

本文关键字:文件 Windows 换行符 返回值 tellg fstream 为什么 文本 输入      更新时间:2023-10-16

程序打开输入文件并多次打印当前读/写位置。

如果文件格式为""作为换行符,则值符合预期: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 的编码,而另一个不是?