c++:Istream 将.txt文件中的每个换行符计为两个
c++: Istream counts every newline in a .txt file as two
我有一个小问题。似乎出于某种原因,我的函数在计算.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
早些时候,我放了一些couts,看起来,size=60,而实际大小是49(检查它),文件中换行符的计数是11,所以正好是60-49。有人可以帮我吗?
为了添加到其他答案中,如果要读取特殊字符(例如换行符),则应以binary
模式而不是文本模式打开文件。
ifstream f(IN_FILE, ios::in | ios::binary);
如果不以二进制模式打开文件,则运行时会将组成'n'
的实际字符转换为单个字符(即 'n'
)。因此,在文本模式下,您不会获得文件的"真实"版本,即文件包含的所有实际字符。
此外,seekg()
和 tellg()
等函数在以文本模式打开的文件时将无法按预期工作,或者至少会给你"错误的结果"(实际上函数本身没有错,但如果你正在编写一个试图"磨练"文件内某个位置的程序,那就错了)。 同样,运行时在后台完成的换行符(和 EOF)转换会妨碍这些函数按您的预期工作。
另一方面,以二进制模式打开的文件允许这些函数按预期工作 - 无需转换换行符或EOF-无论构成文件内容的各个字节是什么,这就是你得到的。
接下来你需要确定的是它是Unix文本文件还是Windows文本文件。 根据它是什么,行尾会有所不同。
Windows 使用"\r"返回到行首 ('\r') 并开始一个新的行首 ('')。
要从计数中删除它们,您必须读取整个文件并计算"\r"的数量。
Windows 将换行符存储为两个字符:"\r",称为回车符和换行符。这就是为什么它被计算两次:实际上有两个字符需要计算。
我假设你在Windows上运行。如果没有,请忽略我在下面的回答。
Windows 将文本文件中的新行字符存储为两个字符(CR LF 或 '\r' '')。因此,寻找文件末尾并调用 tellg() 将返回文件的二进制大小 (60),而不是文本大小 (49)。
为了获得正确的文本大小 (49),一种解决方案是计算每个换行符 (11) 并从总字节大小中减去该数字。
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 我如何根据 c++ 中的行合并两个 2D 数组
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 如何在出现换行符之前将多个整数作为输入?
- 正则表达式 获取两个换行符之间的文本
- 连接两个文件时如何避免冗余尾随换行符?
- 为什么 ifstream 文件中的换行符 - 当被此代码读取时 - 占用 2 个字节
- QRegExp 删除换行符和多个空格
- 每隔n个字符打印一行换行符
- c++:Istream 将.txt文件中的每个换行符计为两个
- 是否用换行符分隔的多个枚举,然后逗号始终可移植
- 如果字符串包含多个 ,如何在每25个换行符( )上分割字符串
- 将文件的前1000个字符读入缓冲区,将换行符转换为 ,并将字符串的地址位置存储为char*[]