get()的异常行为(从c++中的文件读取)
Unusual behaviour of get() (reading from a file in c++)
// Print the last n lines of a file i.e implement your own tail command
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream rd("D:\BigFile.txt");
int cnt = 0;char c;
std::string data;
rd.seekg(0,rd.end);
int pos=rd.tellg();
while(1)
{
rd.seekg(--pos,std::ios_base::beg);
rd.get(c);
if(c=='n')
{
cnt++;
// std::cout<<pos<<"t"<<rd.tellg()<<"n";
}
if(cnt==10)
break;
}
rd.seekg(pos+1);
while(std::getline(rd,data))
{
std::cout<<data<<"n";
}
}
所以,我写了这个程序来打印文本文件的最后10行。然而,它只打印最后5个,由于某种原因,每次遇到实际的"时,下一个get((也会给出一个错误的输出。这是我的输入文件:
Hello
Trello
Capello
Morsello
Odello
Othello
HelloTrello
sdasd
qerrttt
mkoilll
qwertyfe
我在Windows上使用记事本,这是我的输出:
HelloTrello
sdasd
qerrttt
mkoilll
qwertyfe
我不明白为什么会发生这种事,请帮忙。
如果文件以文本模式打开,请不要对文件位置使用算术运算。它不会给你正确的结果。
若文件以文本模式打开,1个字符并不总是意味着1个字节。文件位置是如何实现的(如果它指向特定的字符或字节(是未指定的。
在您的案例中,问题是在Windows上,换行符有两个字节长。文本流将其转换为单字节符号'n'
,所以您不需要担心平台和实际使用的字节序列之间的差异。
所以,您的第一次读取读取两个字节的结束线符号的最后一个字节,该符号恰好和ASCII中的'n'
具有相同的值。下一次读取落在两字节结束线符号的开头,流将其正确转换为'n'
。
相关文章:
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量