主题:[讨论]c++文件读写错误 在线等!!!
huochaiaj
[专家分:0] 发布于 2011-01-20 08:59:00
我将一条信息写入文件中 当修改时 我将原信息覆盖(用的都是file.write()函数) 可是我用codeblock软件根本没修改成功 用visual c++6.0能修改 但改完都是乱码 怎么回事?
回复列表 (共11个回复)
沙发
bruceteen [专家分:42660] 发布于 2011-01-20 10:08:00
你自己觉得别人能回答出“怎么回事”吗?
只能肯定的说你的代码错了,但你没给出你写的错误代码,别人怎么知道你错在哪里?
板凳
huochaiaj [专家分:0] 发布于 2011-01-20 10:46:00
fstream file1;
file1.open("Flight.dat",ios::binary|ios::app);
while(file1.eof())
{
file1.read((char*)&TempF,sizeof(TempF));
if(TempF.ReturnNumber() == CancelP.FlightID)
{
TempF.SetSeat(CancelP.Time,1 );//要修改的部分
file1.seekp(-sizeof(TempF),ios::cur);
file1.write((char*)&TempF,sizeof(TempF));
file1.close();
break;
}
}
3 楼
bruceteen [专家分:42660] 发布于 2011-01-20 10:54:00
第一,为什么用ios::app?我没记错的话,app是“追加”的意思
第二,while(file1.eof()) 既然eof了,你还file1.read个啥
说实话,看不懂你想干什么
4 楼
huochaiaj [专家分:0] 发布于 2011-01-20 11:09:00
这回的:
fstream file1;
file1.open("Flight.dat",ios::binary);
while(!file1.eof())
{
file1.read((char*)&TempF,sizeof(TempF));
if(TempF.ReturnNumber() == CancelP.FlightID)
{
TempF.SetSeat(CancelP.Time,1 );//更新信息
file1.seekp(-sizeof(TempF),ios::cur);//找到要原错误信息后 指针前移
file1.write((char*)&TempF,sizeof(TempF));//覆盖原信息 写入文件
file1.close();
break;
}
}
5 楼
bruceteen [专家分:42660] 发布于 2011-01-20 11:23:00
我仍然看不懂你的代码,我自己写了个测试程序,在VC2008和GCC4.50中都编译测试通过
// 将test.txt中的'i'转化为'I'
#include <fstream>
using namespace std;
int main( void )
{
fstream f( "test.txt", ios_base::in|ios_base::out|ios_base::binary );
if( f )
{
for( char c; f.read(&c,1); )
{
if( c == 'i' )
{
f.seekp( -1, ios_base::cur );
f.write( "I", 1 );
f.sync(); // 用 f.seekp( 0, ios_base::cur ) 是不行的
}
}
f.close();
}
return 0;
}
6 楼
huochaiaj [专家分:0] 发布于 2011-01-20 11:44:00
我在文件里写入新信息可以 但是修改原来的信息就不行
7 楼
bruceteen [专家分:42660] 发布于 2011-01-20 12:00:00
不好意思,我的代码有问题,我没仔细测试,我重写一个
8 楼
bruceteen [专家分:42660] 发布于 2011-01-20 12:29:00
修改完毕,
f.sync(); // 用 f.seekp( 0, ios_base::cur ) 是不行的
但gcc4.5下好像还有问题,我再研究研究
9 楼
bruceteen [专家分:42660] 发布于 2011-01-20 13:24:00
gcc 用 f.seekp( 0, ios_base::cur )
vc 用 f.sync()
看来两个编译器都有问题
10 楼
huochaiaj [专家分:0] 发布于 2011-01-20 15:06:00
多谢
[em2]
我来回复