回 帖 发 新 帖 刷新版面

主题:[讨论]c++文件读写错误 在线等!!!

我将一条信息写入文件中 当修改时 我将原信息覆盖(用的都是file.write()函数) 可是我用codeblock软件根本没修改成功 用visual c++6.0能修改 但改完都是乱码 怎么回事?

回复列表 (共11个回复)

沙发

你自己觉得别人能回答出“怎么回事”吗?
只能肯定的说你的代码错了,但你没给出你写的错误代码,别人怎么知道你错在哪里?

板凳


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 楼

第一,为什么用ios::app?我没记错的话,app是“追加”的意思
第二,while(file1.eof()) 既然eof了,你还file1.read个啥

说实话,看不懂你想干什么

4 楼

这回的:
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 楼

我仍然看不懂你的代码,我自己写了个测试程序,在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 楼

我在文件里写入新信息可以 但是修改原来的信息就不行 

7 楼

不好意思,我的代码有问题,我没仔细测试,我重写一个

8 楼

修改完毕,
                f.sync(); // 用 f.seekp( 0, ios_base::cur ) 是不行的
但gcc4.5下好像还有问题,我再研究研究

9 楼

gcc 用 f.seekp( 0, ios_base::cur )
vc 用 f.sync()
看来两个编译器都有问题

10 楼

多谢
[em2]

我来回复

您尚未登录,请登录后再回复。点此登录或注册