大侠们进来看看,小弟谢了!

blk2010weiwang 2008-06-14 04:59:01
语言编程实现!
1.问题是:
file1包含10000条记录,如何读取10000个记录中的每个记录的地址字段和名称字段,并将该地址字段和名称字段写入到file2中,固定写入的地址字段和名称字段100个字节,并在file2中为地址地段和名称字段建索引,要求索引中保存file2中每个地址字段和名称字段在file2中的首地址。
记录举例:
“100”,“0298813232”,“西安市金属一场”,“xi'an shi jin shu yi chang”,“陕西省西安市”,“陕西省西安市玉泉路东段111号”,

上面记录的类别分别是:
记录编号---联系电话----名称-----名称拼音-----所属行政区域----详细地址

2.我的困难是:
(1)无法读取记录中的特定地段到file2中
我的思路是:每个记录的名称在都在本记录的第二和第三个逗号之间,读取第二和第三个逗号之间的内容,然后用fwrite写入file2.
main()
{
char ch;
int count,a,b;
FILE *fp1,fp2;
fp1=fopen("d:\\file1.txt","r");
fp2=fopen("d:\\file2.txt","w");
ch=fgetc(fp1);
while(ch!=EOF)/*file1中每个记录结束后换行*/
{
if(ch==',')
{
count++;
if(count%6==3)
a=ftell(fp);
else if(count%6==2)
b=ftell(fp);
fread(buffer,a-b,1,fp1);
fwrite(buffer,a-b,1,fp2);
}
ch=fgetc(fp);
}
}
(2)建索引
我的思路是:用ftell就可知道每个记录的地址字段段和名称字段的偏移量以及长度,然后写入file2文件。


各位大侠,不知道这样行不行?我是个菜鸟,望各位大侠指教!谢谢!

...全文
355 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼主给分还真是奇怪哦!~
主要代码0分……一个后续的补充120?夸张……
magipan 2008-06-16
  • 打赏
  • 举报
回复
单个字符的话也可以,,不过要麻烦很多啦,在文件中直接读取,读到','并count之后如果到了想要的内容
直接往下读就是了,以下一个','为该次读取的结束条件
yuzl32 2008-06-16
  • 打赏
  • 举报
回复
%[^,] 代表获取所有字符到相应的域中,直到遇到','为止!比如:

fscanf(fp1,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],",a1,a2,a3,a4,a5,a6);
//第一个%[^,]对应a1,第一次遇到','停止,也就是把100赋值给了a1,其他雷同.

yuzl32 2008-06-16
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
int ret = 0;
FILE *fp1,*fp2;
char a1[100],a2[100],a3[100],a4[100],a5[100],a6[100];
char b1[200];
fp1=fopen("test1.txt","r");
fp2=fopen("test2.txt","a+");

ret = fscanf(fp1,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],",a1,a2,a3,a4,a5,a6);
while( ret && ret != EOF)
{
//buffer[a-b]='\0';//字符串必须以'\0'结束
//fwrite(buffer,a-b,1,fp2);
strcpy(b1,a3);
strcat(b1,","); /* 以逗号分隔 */
strcat(b1,a6);
strcat(b1,"\n"); /* 以回车结束一行 */
fwrite(b1,strlen(b1),1,fp2); /* fp为指向file2的文件指针 */
ret = fscanf(fp1,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],",a1,a2,a3,a4,a5,a6);
}
fclose(fp1);
fclose(fp2);
}



//test1.txt
100,0298813232,西安市金属一场,xi'an shi jin shu yi chang,陕西省西安市,陕西省西安市玉泉路东段111号,
100,0298813232,西安市金属二场,xi'an shi jin shu yi chang,陕西省西安市,陕西省西安市玉泉路东段222号,


//test2.txt
西安市金属一场,陕西省西安市玉泉路东段111号
西安市金属二场,陕西省西安市玉泉路东段222号
yuzl32 2008-06-16
  • 打赏
  • 举报
回复
^_^
  • 打赏
  • 举报
回复
如果确定每条记录有6个字段的话,

if(ret > 0)
改成
if(ret >= 6)
这样只有数据完整时才执行具体操作……

以上代码在linux、unix下也能运行
blk2010weiwang 2008-06-16
  • 打赏
  • 举报
回复
好,呵呵,谢谢了,我研究研究,无论成功与否,我的分给你吧!毕竟学了不少的东西。!
  • 打赏
  • 举报
回复
慢慢研究吧!~
几乎把文件的所有操作都用上了……
  • 打赏
  • 举报
回复

/* index.c
* file1包含10000条记录,如何读取10000个记录中的每个记录的地址字段和名称字段,
* 并将该地址字段和名称字段写入到file2中,
* 并在file2中为地址字段和名称字段建索引,
* 要求索引中保存file2中每个地址字段和名称字段在file2中的首地址。

* 记录举例: file1.txt
* 100,0298813232,西安市金属一场,xi'an shi jin shu yi chang,
* 陕西省西安市,陕西省西安市玉泉路东段111号,
* 101,0298813233,西安市金属二场,xi'an shi jin shu er chang,
* 陕西省西安市,陕西省西安市玉泉路东段222号,
* 102,0298813234,西安市金属三场,xi'an shi jin shu san chang,
* 陕西省西安市,陕西省西安市玉泉路东段333号,
*
* 上面记录的类别分别是:
* 记录编号---联系电话----名称-----名称拼音-----所属行政区域----详细地址

* file2.txt
* 0000:西安市金属一场,陕西省西安市玉泉路东段111号,0015,0070
* 0098:西安市金属二场,陕西省西安市玉泉路东段222号,0016,0071
* 0198:西安市金属三场,陕西省西安市玉泉路东段333号,0016,0072
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *fp1,*fp2; /* fp1、fp2分别指向原数据文件file1.txt、索引文件file2.txt */
char b[200]; /* 写数据时的缓存 */
char c[200]; /* 写数据时的缓存 */
char a1[100],a2[100],a3[100],a4[100],a5[100],a6[100]; /* a1-a6表示每条记录的6个字段 */
int ret = 0; /* 实际写数据的个数 */
long pos = 0; /* 记录首地址 */
long pos3 = 0; /* a3偏移量 */
long pos6 = 0; /* a6偏移量 */

/* 打开文件最好这样打开的同时进行一下判断 */
if((fp1 = fopen("e:\\file1.txt","r")) == NULL) /* 注意位置,如果不加盘符,则默认在当前程序所在目录 */
{
printf("打开文件file1.txt出错!\n");
fclose(fp1);
exit(0);
}
/* file2是新文件,最好用a的方式打开,这样的话如果没有这个文件,就会自动建立一个文件 */
if((fp2 = fopen("e:\\file2.txt","a")) == NULL)
{
printf("打开文件file2.txt出错!\n");
fclose(fp2);
exit(0);
}

/* 将file.txt的内容写入到file2.txt中 */
while(!feof(fp1))
{
/* 每次读取数据时都要初始化 */
ret = 0;
memset(a1,'\0',sizeof(a1));
memset(a2,'\0',sizeof(a2));
memset(a3,'\0',sizeof(a3));
memset(a4,'\0',sizeof(a4));
memset(a5,'\0',sizeof(a5));
memset(a6,'\0',sizeof(a6));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));

pos = ftell(fp1);
ret = fscanf(fp1,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],",a1,a2,a3,a4,a5,a6);

if(ret > 0)
{

/* 建立索引 */
sprintf(c,"%04ld",pos);
strcat(c,":");
fwrite(c,strlen(c),1,fp2);

/* 偏移量 */
pos3 = (long)(strlen(a1) + 1 + strlen(a2) + 1);
pos6 = (long)(pos3 + strlen(a3) + 1 + strlen(a4) + 1 + strlen(a5) + 1);

/* 截取数据 */
strcpy(b,a3);
strcat(b,","); /* 以逗号分隔 */
strcat(b,a6);
fwrite(b,strlen(b),1,fp2); /* fp为指向file2的文件指针 */

/* 写偏移量 */
memset(c,'\0',sizeof(c));
memset(b,'\0',sizeof(b));
sprintf(c,"%04ld",pos3);
sprintf(b,"%04ld",pos6);
strcat(c,",");
strcat(c,b);
strcat(c,"\n");
fwrite(c,strlen(c),1,fp2);
}
}
fclose(fp1);
fclose(fp2);

return 0;
}
blk2010weiwang 2008-06-16
  • 打赏
  • 举报
回复
jillnicky ,你好,我按照你的方法做了,不过还是没有写入file2成功,大侠给改改,还有指出我的if语句那里该怎么改啊。我将分全给你。呵呵!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
FILE *fp1,*fp2;
char a1[100],a2[100],a3[100],a4[100],a5[100],a6[100];
char b1[200];
fp1=fopen("d:\\test1.txt","r");
fp2=fopen("d:\\test2.txt","w");
fscanf(fp1,"%s,%s,%s,%s,%s,%s,",a1,a2,a3,a4,a5,a6);
//buffer[a-b]='\0';//字符串必须以'\0'结束
//fwrite(buffer,a-b,1,fp2);
strcpy(b1,a3);
strcat(b1,","); /* 以逗号分隔 */
strcat(b1,a6);
strcat(b1,"\n"); /* 以回车结束一行 */
fwrite(b1,strlen(b1),1,fp2); /* fp为指向file2的文件指针 */
fclose(fp1);
fclose(fp2);
}
blk2010weiwang 2008-06-16
  • 打赏
  • 举报
回复
a3,a6的偏移量是指a3,a6开始部分距离所在记录开始部分的长度。
0001:0000,0098,0000,0063,
blk2010weiwang 2008-06-16
  • 打赏
  • 举报
回复
顺便问一句fscanf(fpr,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]\n",a1,a2,a3,a4,a5,a6);
中%[^,]是什么意思啊?
blk2010weiwang 2008-06-16
  • 打赏
  • 举报
回复
0001:0000,0098,0036,0063,
  • 打赏
  • 举报
回复
我之前是按照你40楼说的写的,后来看到你32楼写的了,那个超级简单,就改了一下……
描述不清楚……
是file2中记录:
当前记录个数:file1中的首地址,file1中当前记录长度,a3偏移量,a6偏移量
如:
0001:0000,0098,3,6
???????????
  • 打赏
  • 举报
回复
我的那个方法是比较简单的!~
别一个一个读取……
blk2010weiwang 2008-06-16
  • 打赏
  • 举报
回复
的确是0000:,后面就没了。每个记录的首地址和长度,a3(名称字段)和a6(地址字段)的偏移量好像也没有。呵呵!
blk2010weiwang 2008-06-16
  • 打赏
  • 举报
回复
望哪位大侠赐教!我现在知道,在我的程序里
while(ch!=EOF&&ch==',')
{

count++;
有问题,因为一开始ch是不等于逗号的,所以以后的那些个if语句就不执行,我改成
while(ch!=EOF)
{
if(ch==',')
{count++;}
if......
......
......
}
也只是后面的if可以执行,但是if(ch==','){count++;}无法执行,后面的if语句要用到count的值,所以count的值无法传递,所以程序一直不能运行成功。

  • 打赏
  • 举报
回复
之后就可以将a3,a6组合之后写入file2

a为字符数组
strcpy(a,a3);
strcat(a,","); /* 以逗号分隔 */
strcat(a,a6);
strcat(a,"\n"); /* 以回车结束一行 */
fwrite(a,strlen(a),1,fp); /* fp为指向file2的文件指针 */
  • 打赏
  • 举报
回复
更正8楼……
每次读取数据的时候用fscanf

100,0298813232,西安市金属一场,xi'an shi jin shu yi chang,陕西省西安市,陕西省西安市玉泉路东段111号
如果每行数据以回车\n结束,各数据之间用逗号,分隔的话,可以这样:
a1,a2,a3,a4,a5,a6均为字符数组
fscanf(fpr,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]\n",a1,a2,a3,a4,a5,a6);
a3名称字段--就是第2、3个逗号之间的数据()
a6地址字段

100,0298813232,西安市金属一场,xi'an shi jin shu yi chang,陕西省西安市,陕西省西安市玉泉路东段111号,
如果每行数据以逗号,结束,各数据之间用逗号,分隔的话,可以这样:
a1,a2,a3,a4,a5,a6均为字符数组
fscanf(fpr,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],",a1,a2,a3,a4,a5,a6);
a3名称字段
a6地址字段
  • 打赏
  • 举报
回复
是0100:……????

/* index.c
* file1包含10000条记录,如何读取10000个记录中的每个记录的地址字段和名称字段,
* 并将该地址字段和名称字段写入到file2中,
* 并在file2中为地址字段和名称字段建索引,
* 要求索引中保存file2中每个地址字段和名称字段在file2中的首地址。

* 记录举例: file1.txt
* 100,0298813232,西安市金属一场,xi'an shi jin shu yi chang,
* 陕西省西安市,陕西省西安市玉泉路东段111号,
* 101,0298813233,西安市金属二场,xi'an shi jin shu er chang,
* 陕西省西安市,陕西省西安市玉泉路东段222号,
* 102,0298813234,西安市金属三场,xi'an shi jin shu san chang,
* 陕西省西安市,陕西省西安市玉泉路东段333号,
*
* 上面记录的类别分别是:
* 记录编号---联系电话----名称-----名称拼音-----所属行政区域----详细地址

* file2.txt
* 0100:西安市金属一场,陕西省西安市玉泉路东段111号
* 0101:西安市金属二场,陕西省西安市玉泉路东段222号
* 0102:西安市金属三场,陕西省西安市玉泉路东段333号
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *fp1,*fp2; /* fp1、fp2分别指向原数据文件file1.txt、索引文件file2.txt */
char b[200]; /* 写数据时的缓存 */
char c[200]; /* 写数据时的缓存 */
char a1[100],a2[100],a3[100],a4[100],a5[100],a6[100]; /* a1-a6表示每条记录的6个字段 */
int ret = 0; /* 实际写数据的个数 */
int ii = 0;

/* 打开文件最好这样打开的同时进行一下判断 */
if((fp1 = fopen("e:\\file1.txt","r")) == NULL) /* 注意位置,如果不加盘符,则默认在当前程序所在目录 */
{
printf("打开文件file1.txt出错!\n");
fclose(fp1);
exit(0);
}
/* file2是新文件,最好用a的方式打开,这样的话如果没有这个文件,就会自动建立一个文件 */
if((fp2 = fopen("e:\\file2.txt","a")) == NULL)
{
printf("打开文件file2.txt出错!\n");
fclose(fp2);
exit(0);
}

/* 将file.txt的内容写入到file2.txt中 */
while(!feof(fp1))
{
/* 每次读取数据时都要初始化 */
ret = 0;
memset(a1,'\0',sizeof(a1));
memset(a2,'\0',sizeof(a2));
memset(a3,'\0',sizeof(a3));
memset(a4,'\0',sizeof(a4));
memset(a5,'\0',sizeof(a5));
memset(a6,'\0',sizeof(a6));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));

ret = fscanf(fp1,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],",a1,a2,a3,a4,a5,a6);

if(ret > 0)
{
/* 建立索引 */
sprintf(c,"%04ld",atol(a1));
strcat(c,":");
fwrite(c,strlen(c),1,fp2);

/* 截取数据 */
strcpy(b,a3);
strcat(b,","); /* 以逗号分隔 */
strcat(b,a6);
strcat(b,"\n"); /* 以回车结束一行 */ /* 如果想以逗号结束可以用strcat(b,","); */
fwrite(b,strlen(b),1,fp2); /* fp为指向file2的文件指针 */
}
}
fclose(fp1);
fclose(fp2);

return 0;
}
加载更多回复(29)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧