首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++读文件时常抽风咋回事

2013-12-04 
C++读文件时常抽风怎么回事?用C++文件流,写入二进制数据到文本中。 然后再次打开时还得看文件流心情好不好。

C++读文件时常抽风怎么回事?
用C++文件流,写入二进制数据到文本中。 然后再次打开时还得看文件流心情好不好。心情好,文件读得出。心情不好。文件读不出。  实在太让我抓狂了。

1. 每次读写文件都是需要写入的时候才打开文件,文件写完后确定都调用了close()关闭文件。
2. 确定每次读和写的时候都没有使用任何工具打开需要读取信息或者写入信息的文本。
3. 读写文件都是独立的函数,并且读写都是分开函数的。不存在混合一起。

求大神告知下为什么C++读写文件会抽风,或者哪些情况下容易让人抓狂C++读文件时常抽风咋回事
[解决办法]

引用:
Quote: 引用:

够复杂的。听你的描述好像是文件流的毛病了,两点建议。
(1) 每次读取动作后,检查流的完整性,看看上次读取是不是出问题了,这样能够尽早定为问题的点。
(2) 把整个文件复制到字符串内进行解析,看看还出不出问题,这样你能够控制读取位置的精确走向,至少可以排除与其相关的问题。
另外,可以用其它程序打开文件,看看其二进制内容是不是像你想的那样,还是写文件的时候就已经写入了损坏的信息。

1. 当出现问题后每次都是单步调试并且实时盯着m_iFile.tellg();并且每次跑一行代码后都会使用WInHex观察文件内容和当前调试的m_iFile.tellg()的偏移是否和文件中的数据偏移是否一致。然后关闭WInHex才敢继续往后但不调试

2. 把内容写入文件后复制二进制数据并且粘贴到文件中查看。并未发现复制出来的数据是写入错误的。
写入文件的时候是专门弄了一个的函数调用写入。并且接收的参数是struct引用 + int的文件偏移。 

如果说多数据写入错误会导致计算偏移出错还有可能毁掉二进制文件,但是仅仅三块数据就算毁掉也能发现。问题是写入三块文件并没有被毁掉。但是却偏偏文件流总是不高兴不让我读出来。我就真纳闷了。。不知道什么原因

如果说是文件流的错误我想会被广大C++中有嘲讽和喷死。。但是我实在找不出到底是什么原因导致让文件流不高兴时而能正确读出时而不高兴不正确读出。。。

1. 我的意思是每个 read 或 >> 后面增加 if (m_iFile) 之类的自动化检测,不是让你自己拿眼睛看。
2. 你为啥要复制粘贴呢?直接找个能够读取二进制文件的程序,打开文件不就行了吗。复制粘贴的问题在于,系统做这些操作的时候可能重新解释内容,比如 \n 可能就不显示了,等等。不是说这些问题肯定在你的操作步骤中发生了,但现在调程序,要尽可能排出不可控因素。

喷不喷死我不知道,不过 99.9% 的可能性跟文件流没关系。如果你怀疑流的问题,我也建议你了,可以打开文件后一次性读入到字符串,然后你自己处理。如果你连这一个 read 也不放心,还可以使用 C 文件操作完成,这样彻底和文件流没关系了。你先确定你自己的程序在没有 C++ 流介入下的行为,如果确实正确无误,再怀疑流也还说得过去。
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

[解决办法]
从你的代码来看, 我猜, 发生你所说的问题的可能原因是. seekg出问题了.

你测试下, 每次都seekg到文件起始位置读取, 看是否会出现读取不到的情况.

如果seekg失败, 查看错误码, 找原因. 

还有需要注意, 你的读写是否同步互斥的, 即读取的时候不会写, 写的时候不会读取.

热点排行