gpt4 book ai didi

c++:Istream 将 .txt 文件中的每个换行符计为两个

转载 作者:行者123 更新时间:2023-11-30 03:43:29 28 4
gpt4 key购买 nike

我遇到了一个小问题。似乎出于某种原因,我的函数在计算 .txt 文件的大小时计算换行符,因为它是两个字符而不是一个。这是函数:

#define IN_FILE "in_mat.txt"    

#define IN_BUF
#ifdef IN_BUF
void inBuf(char *(&b)){

streampos size;

ifstream f(IN_FILE, ios::in);

f.seekg(0,ios::end);
size=f.tellg();

b=new char[size];

f.seekg(0, ios::beg);
f.read(b, size);

f.close();
}
#endif

这是读取的文件:

2 2
1 0
0 1
2 2
i 0
0 -i
2 2
0 1
-1 0
2 2
0 i
i 0

早些时候,我放了一些 cout,看起来 size=60,而实际大小是 49(已检查),文件中换行符的数量是 11,所以恰好是 60-49。有人可以帮我吗?

最佳答案

要添加到其他答案中,如果您想读取换行符等特殊字符,您应该以 binary 模式而不是文本模式打开文件。

ifstream f(IN_FILE, ios::in | ios::binary);

如果您不以二进制模式打开文件,则构成 '\n' 的实际字符会被运行时转换为单个字符(即 '\n ').因此,在文本模式下,就文件所包含的所有实际字符而言,您不会获得文件的“真实”版本。

此外,对于以文本模式打开的文件,seekg()tellg() 等函数将无法按预期工作,或者至少可以给你“错误的结果”(实际上函数本身并没有错,但如果你正在编写一个试图在文件中的某个位置“磨练”的程序,那就错了)。同样,运行时在幕后完成的换行符(和 EOF)转换会妨碍这些函数按您预期的方式工作。

另一方面,以二进制模式打开的文件允许这些函数按预期工作——没有换行符或 EOF 的转换——无论构成文件内容的各个字节是什么,这就是你得到的。

接下来需要确定的是它是 Unix 文本文件还是 Windows 文本文件。根据它是哪一个,行尾将不同。

关于c++:Istream 将 .txt 文件中的每个换行符计为两个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36045606/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com