操作文件,给个思路

painAndhappy 2005-06-09 12:27:15
两个文件:主文件和数据文件.
把两个文件中,KEY匹配的数据抽出,然后放入另外一个文件.
希望各位能给个思路,包括变量的定义与函数的分割.
...全文
208 点赞 收藏 18
写回复
18 条回复
painAndhappy 2005年06月12日
非常感谢大家的帮助!
回复 点赞
dinner3000 2005年06月10日
楼上的搞什么飞机?
回复 点赞
painAndhappy 2005年06月10日
TO : garfunkle(摇滚下的蛋)
谢谢回答!对于输入(主文件及数据文件)和输出,使用的都是文本文件.
方法应该是可行的.但是,如果这样的话,因为每次都要遍历数据文件,效率可能比较低.
回复 点赞
51365133 2005年06月10日
#include "stdio.h"
#include "stdlib.h"

int main()
{
FILE *fp;
char *str="i love c and c++";
if((fp=fopen("d:\\data.txt","w"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
fwrite(str,sizeof(str),sizeof(str),fp);
fclose(fp);
system("pause");
return 0;
}
回复 点赞
dinner3000 2005年06月10日
主文件
ID1 ID2 NAME
===================
001 0001 zhao
002 0002 qian
003 0003 sun
004 0004 li

数据文件
ID1 ID2 AGE TEL
==============================
001 0001 11 11111111 ------>数据A
001 0002 12 12121212 ------>数据B
003 0003 33 33333333 ------>数据C

上述数据中,KEY为ID1和ID2,则"数据A"和"数据C"因为能在主文件中找到对应的KEY,所以抽出,
放入另外一个文件.

基本就是这么一个东东.


=====================================================================================
具体实现:

要从数据文件中匹配到:
001 0001 zhao
awk -F"\t" '{ if ( $1=="001" && $2=="0001" ) { print; } }' 数据文件 >> 导出文件
|
+---以tab为列分隔符
可以用shell或者C++程序动态生成上面的语句
回复 点赞
dinner3000 2005年06月10日
unix下的话,建议用脚本,速度不比C++慢,而且比较灵活,你可以参考一下AWK,和SORT的用法,结合管道,应该很容易实现你说的功能,前一阵,由于工作需要用上述方法实现了类似文本型数据库操作的程序
回复 点赞
darkwanderer 2005年06月10日
我在作的一个东西跟楼主的要求有些相关性,我把我的想法说一下,如果对楼主有帮助就最好了。

对于文件的每一个记录而言,需要记录下所有的字段的值,以方便以后的比较和复制字段的值等操作。为了有普适性,建立如下的结构体:
struct RECORD_INFO {
int item_cnt;
char *item_list[MAX];
char work_buf[LENG];
};
从文件里读一行数据,放入work_buf中,然后写一个函数(主要是过滤空格和TAB之类的),将该条记录的每个字段在work_buf中的地址记录下来,依次放入item_list中,如此,通过item_list就可以方便的检索到每条记录的各个字段的值了。

由于不知道你的两个文件之间的ID的依赖关系,所以做最一般的处理:
首先,把主文件的所有记录进行逐条读取,通过上面所进行的操作,可以把ID都取出来,放在一个存放主文件ID的结构体数组里。然后开始读数据文件,对于每一条记录,取到其ID,与已经读取的主文件ID逐条比较,如果符合,取出要取的字段的值,如此循环。

思路如上,程序我就不提供了。:)
回复 点赞
painAndhappy 2005年06月10日
自己再顶一下.
回复 点赞
garfunklett 2005年06月10日
首先 写一个 一次读一条记录的函数(主文件和数据库文件如果格式不同的话 就分别写)

然后 建立 两个叫做temp1 temp2 的struct 一个用来存当前的主文件记录 一个用来存当前数据库文件

然后

打开主文件;
打开用来输出的文件;

读主文件一条记录到struct temp1;

while(主文件还有内容)
{
打开数据库文件;
读一条数据库文件到temp2;
while(数据库文件还有内容)
{
if(temp1&temp2中的 id1 和 id2相等)
输出此条记录到输出文件;
读一条数据库文件记录到temp2;
}
读一条主文件记录到temp1;
}

是这个意思么?使用的文件么? 还是使用数据库了?
回复 点赞
garfunklett 2005年06月10日
不知道你的一条 是不是就是一行 反正肯定有一定的格式
回复 点赞
painAndhappy 2005年06月09日
To:dinner3000(dinner3000)
是UNIX编程

jixingzhong(瞌睡虫)
正如5420(薰衣草)所说的,数据条数预先无法得知。
而如果每次对应与数据文件的一条数据,都要重新去读一遍主文件进行遍历的话,效率就太低了。
回复 点赞
5420 2005年06月09日
楼上的行不能,如你所说建立两个结构体,但是结构体内元素个数从何得知,楼主只是举了个例子,但是是特殊情况,可是写出来的程序要有通用性!
回复 点赞
jixingzhong 2005年06月09日
建立两个结构体,依次对应主文件和数据文件,(结构提和文件的内容要呼应!!)

循环读取数据,并且比较两个结构体的KEY项,

相等时,将对应于数据文件的结构体中的非KEY项的内容写入新建的一个文件。


直到文件结素,数据抽取完毕。
回复 点赞
dinner3000 2005年06月09日
你是unix编程还是windows?
回复 点赞
tian_su 2005年06月09日
学习
关注
回复 点赞
painAndhappy 2005年06月09日
自己顶一下.
回复 点赞
painAndhappy 2005年06月09日
比如说

主文件
ID1 ID2 NAME
===================
001 0001 zhao
002 0002 qian
003 0003 sun
004 0004 li

数据文件
ID1 ID2 AGE TEL
==============================
001 0001 11 11111111 ------>数据A
001 0002 12 12121212 ------>数据B
003 0003 33 33333333 ------>数据C

上述数据中,KEY为ID1和ID2,则"数据A"和"数据C"因为能在主文件中找到对应的KEY,所以抽出,
放入另外一个文件.

基本就是这么一个东东.
回复 点赞
zhousqy 2005年06月09日
描述太模糊
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告