免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8541 | 回复: 5
打印 上一主题 下一主题

[C++] 如何使用c++的fstream对文件读写操作(库函数) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-20 15:18 |只看该作者 |倒序浏览
是这个样子的.存在一个文件内容格式如下
ID1   name1
ID2   name2
....

我想检索出来IDx  显示对应的namex,
然后修改namx 为xnamex

看了c++的文件操作部分, fstream可以对文件进行读写,但是
针对上面的要求如何实现

谢谢

论坛徽章:
0
2 [报告]
发表于 2005-01-21 09:59 |只看该作者

如何使用c++的fstream对文件读写操作(库函数)

std::ifstream input(filename);
std::sting str;
while (getline(input, str))
{
std::string index;
std::string name;
.....
}
从input中取出index和name,然后修改!

论坛徽章:
0
3 [报告]
发表于 2005-01-21 17:00 |只看该作者

如何使用c++的fstream对文件读写操作(库函数)

兄弟,你修改的话只是name变量的值,你要回填到文件中的呀,如何回填
input<<index<<name<<endl;
input.flush();
input.close();
是不会向文件中写东西的

论坛徽章:
0
4 [报告]
发表于 2005-01-21 21:18 |只看该作者

如何使用c++的fstream对文件读写操作(库函数)

如果用c的话,可以用lseek,让后write,呵呵

论坛徽章:
0
5 [报告]
发表于 2005-01-22 22:41 |只看该作者

如何使用c++的fstream对文件读写操作(库函数)

把整个文件重新写一遍得了

论坛徽章:
0
6 [报告]
发表于 2005-01-25 11:12 |只看该作者

如何使用c++的fstream对文件读写操作(库函数)

我有两个实现,一个是通过使用list,将文件中的所有数据检索出来处理,然后在回填到文件中.但是比较吃内存(都要导出到内存中这个实现简单就不说了,

还有一种实现,如下:
#include <fstream>;
#include <string>;
#include <iostream>;

//specifies the operating system
//因为dos中文本文件格式0d 0a回车换行
//unix下只有od
#ifndef DOS
#define DOS
#endif

#ifdef UNIX
#undef UNIX
#endif

using namespace std;

void main()
{
        int ID = 1;
        string name;
        streampos preGP=0;
        streampos insPP = 0;
        int i=0;

                fstream fout("aaa.txt", ios::in|ios:ut);

        preGP=fout.tellg();   //获取检索下一个数据前的位置
        cout<<i<<"  pos: "<<preGP<<endl;
        fout>;>;ID>;>;name;

        while(!fout.eof())
        {
                if (ID == 200)
                {
                        cout<<"the id = 100 the origan name : "<<name<<endl;
                        name = "testas";
//#ifdef DOS
                                                fout.seekp(preGP+streampos(2), ios::beg);
//#endif
/*#ifdef UNIX
                                                fout.seekp(preGP+streampos(1), ios::beg);
#endif*/
                        insPP = fout.tellp();
                        cout<<"the insert data pos: "<<insPP<<endl;
                        fout<<ID<<" "<<name<<endl;
                       
               }
               preGP = fout.tellg();  //获取检索下一个数据前的位置

               cout<<++i<<"  pos: "<<preGP<<endl;
               fout>;>;ID>;>;name;
               
        }
        fout.flush();
       
        fout.close();

        cout<<"test.log ok"<<endl;
}

但是存在这样一个问题如果新name的数据很长例如:"testaaaaaaaaaaaaffffffff", 那么新的数据就会覆盖掉id = 300以及后面的数据.或许这样也更容易理解为什么数据库中要求指定数据段的长度,必须在一个范围内,否则就可能覆盖掉后面的数据,而在oracle中如果某字段是char(20).值"hello",他也会自动填充空格进去"hello       "使其长度为20
是否有一种方法可以直接 bbb覆盖调并且保持
300 ... 等后面的数据不被覆盖.并且其name长度是任意的
请教

我的文件中的数据如下:
100 aaa
200 bbb
300 ccc
400 ddd
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP