一个文件中间有0x1A字符(会触发EOF()),这样的文件如何用文件流读取?

austin_minny 2010-11-03 04:33:47
我用的是ifstream,文本方式打开,用EOF()来控制读操作结束,结果读到这个1A的时候ifstream的EOF()就被触发了,所以後面的内容就读不下来了。

这种情况怎么办?我试过用二进制打开文件流,也一样没用。请高手赐教!
...全文
591 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
austin_minny 2010-11-04
  • 打赏
  • 举报
回复
最后采取了先一次性读入,再从buffer中分离每行,多谢各位
Linux-Torvalds 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 austin_minny 的回复:]

另外想再问一下如果二进制方式1A不会触发eof,那么如何判断文件尾呢
[/Quote]
自己判断
赵4老师 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 austin_minny 的回复:]
最后采取了先一次性读入,再从buffer中分离每行,多谢各位
[/Quote]
这种方法要冒文件很大内存装不下的危险。
ForestDB 2010-11-03
  • 打赏
  • 举报
回复
二进制读取,“一行”自己判断。
RLib 2010-11-03
  • 打赏
  • 举报
回复
不明不明。。。。ReadFile
alanyuen 2010-11-03
  • 打赏
  • 举报
回复

char buf[] = { 0x31, 0x1A, 0x32, 0x1A, 0x0};
ofstream out("d:/test.txt", ios::out);
out.write(buf, _countof(buf));
out.close();

ifstream in("d:/test.txt", ios::binary);
in.seekg(0, ios::end);
int filesize = in.tellg();
in.close();
austin_minny 2010-11-03
  • 打赏
  • 举报
回复
另外想再问一下如果二进制方式1A不会触发eof,那么如何判断文件尾呢
austin_minny 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luciferisnotsatan 的回复:]
用二进制读,自己判断换行符
linux下 \n
windows下 \r\n

lz不能把代码发出来的话,那就只能自己调下了。跟进那些函数,看看到底是什么导致eof的。

二进制怎么会碰到1A就结束?
[/Quote]

代码简单说就是这样:
ifstream in;
in.open(szFileName,ios::binary,0);
while(!in.eof())
{
in.get(cRead);
}

我调试的时候就构造了一个一行的文件,那行的内容是abc<0x1A>de,现象是,当c读下来之后,下一次循环中cRead仍为c(我想这时文件流已经发现0x1A了),之后再判断eof的时候,就退出了
alanyuen 2010-11-03
  • 打赏
  • 举报
回复
ifstream in("d:/test.txt", ios::binary);
赵4老师 2010-11-03
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
luciferisnotsatan 2010-11-03
  • 打赏
  • 举报
回复
用二进制读,自己判断换行符
linux下 \n
windows下 \r\n

lz不能把代码发出来的话,那就只能自己调下了。跟进那些函数,看看到底是什么导致eof的。

二进制怎么会碰到1A就结束?
austin_minny 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dingshaofengbinbin 的回复:]
skip,跳过去!!!
[/Quote]
可是我该怎么判断何时skip勒,因为一读到1A就结束了?貌似想判断都不行
austin_minny 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]
引用 3 楼 austin_minny 的回复:

引用楼主 austin_minny 的回复:
我用的是ifstream,文本方式打开,用EOF()来控制读操作结束,结果读到这个1A的时候ifstream的EOF()就被触发了,所以後面的内容就读不下来了。

这种情况怎么办?我试过用二进制打开文件流,也一样没用。请高手赐教!


可是我的程序的场景是要一行行地读,所以我是用ifs……
[/Quote]
我的文件实际上是文本文件,问题就是其中有些乱码,比如就是参杂入了0x1A,我读的时候就是以要以换行符为分界,把文本一行行读下来
dingshaofengbinbin 2010-11-03
  • 打赏
  • 举报
回复
skip,跳过去!!!
luciferisnotsatan 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 austin_minny 的回复:]

引用楼主 austin_minny 的回复:
我用的是ifstream,文本方式打开,用EOF()来控制读操作结束,结果读到这个1A的时候ifstream的EOF()就被触发了,所以後面的内容就读不下来了。

这种情况怎么办?我试过用二进制打开文件流,也一样没用。请高手赐教!


可是我的程序的场景是要一行行地读,所以我是用ifstream地get函数来读的,有没有不用这种一次性读取……
[/Quote]

二进制文件哪有一行一行的概念?lz把你的代码发上来看下吧
austin_minny 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gules 的回复:]
二进制方式的读取不要再用>>操作符了,而用read成员函数。
[/Quote]
那要用什么来替代EOF呢,因为我感觉不管怎么读,EOF只要一碰到0X1A就触发了
austin_minny 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 austin_minny 的回复:]
我用的是ifstream,文本方式打开,用EOF()来控制读操作结束,结果读到这个1A的时候ifstream的EOF()就被触发了,所以後面的内容就读不下来了。

这种情况怎么办?我试过用二进制打开文件流,也一样没用。请高手赐教!
[/Quote]

可是我的程序的场景是要一行行地读,所以我是用ifstream地get函数来读的,有没有不用这种一次性读取的办法呢?
gules 2010-11-03
  • 打赏
  • 举报
回复
二进制方式的读取不要再用>>操作符了,而用read成员函数。
chary8088 2010-11-03
  • 打赏
  • 举报
回复
强制读取文件大小个字节
fread(buffer, 1, FileSize, fp);

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧