真无聊一人 2018-12-23 08:38 采纳率: 100%
浏览 779
已采纳

c++文件流中想要删除文本文件中的某些字符串,为什么下面的代码删除那部分无法运行出来?

我想是的先把数据读进文件中,然后再打开,用原来的部分数据覆盖文件中的数据,可是下面这段代码的“修改”之后的部分运行出来的结果是错的,请问是怎么回事呢?
或者有没有更好的删除数据的办法?

#include<iostream>
#include<stdlib.h>
#include<fstream>
using namespace std;
int main()
{   
    int i=0;
    char a[100],b[100],c[100];  
    cout<<"请输入三条记录(每条记录以#结束):\n"
        <<"第一条:\n";
    cin.getline(a,100,'#'); 
    cout<<"第二条:\n";
    cin.getline(b,100,'#');
    cout<<"第三条:\n";
    cin.getline(c,100,'#');

    //导入数据
    ofstream outfile("student.dat");
    ofstream fcout("d:\\student.dat");
    if(fcout.fail())
    {   
        cerr<<"error opening file\n";
        return 0;
    }   
    fcout<<a<<endl<<b<<endl<<c<<endl;
    fcout.close();
    fcout.clear(); 

    //读取输出
    ifstream fcin("d:\\student.dat");
    if(fcin.fail())
    {   
        cerr<<"error opening file\n";
        return 0;
    }
    fcin.getline(a,100,'#');
    cout<<"删除前为:\n";
    cout<<a<<endl;
    fcin.close();
    fcin.clear(); 

    system("pause");

    //用 a和c这两个字符串 覆盖文件中的原来的数据,目的为了删除b这个字符串

    //删除--打开文件 
    if(fcout.fail())
    {
        cerr<<"error opening file\n";
        return 0;
    }
    fcout<<a<<endl<<c<<endl;
    fcout.close();

    //提取数据输出 
    if(fcin.fail())
    {
        cerr<<"error opening file\n";
        return 0;
    }
    fcin.getline(a,100,'#');
    cout<<"删除后为:\n"<<a<<endl<<c<<endl;
    fcin.close();
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 真无聊一人 2018-12-23 01:08
    关注

    c++文件流操作中,从文件中提取数据时,是现将数据存入一个变量中,然后再将这个变量输出。问题中这段代码犯了一个错误,就是忽略了在文件流中提取数据时“fcin>>a”就是将文件流中的数据提取到'“a”中,然后“a”原来的数据就被覆盖了,所以程序的运行结果是错误的。以下代码能够运行出来:

    #include<iostream>
    #include<fstream>
    using namespace std;
    int main()
    {   
        int i=0,j=0;
        char a[100],b[100],c[100],d[100];   
        cout<<"请输入三条记录(每条记录以#结束):\n"
            <<"第一条:\n";
        cin.getline(a,100,'#'); 
        cout<<"第二条:\n";
        cin.getline(b,100,'#');
        cout<<"第三条:\n";
        cin.getline(c,100,'#');
    
        //导入数据
        ofstream outfile("student.dat");
        ofstream fcout("d:\\student.dat");
        if(fcout.fail())
        {   
            cerr<<"error opening file\n";
            return 0;
        }   
        fcout<<a<<endl<<b<<endl<<c<<endl;
        fcout.close();
    
        //读取输出
        ifstream fcin("d:\\student.dat");
        if(fcin.fail())
        {   
            cerr<<"error opening file\n";
            return 0;
        }
        fcin.getline(d,100,'#');
        cout<<"删除前为:\n";
        cout<<d<<endl;
    
        //删除 
        while(a[i]!='\0')
        {
            d[i]=a[i];
            i++;
        }
        while(c[j]!='\0')
        {
            d[i]=c[j];
            i++,j++;
        }
        d[i]='\0';
    
        cout<<"删除后为:\n"
            <<d<<endl;
        fcin.close();
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题