69,381
社区成员
发帖
与我相关
我的任务
分享
fscanf(fp1,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],",a1,a2,a3,a4,a5,a6);
//第一个%[^,]对应a1,第一次遇到','停止,也就是把100赋值给了a1,其他雷同.
#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号
如果确定每条记录有6个字段的话,
将
if(ret > 0)
改成
if(ret >= 6)
这样只有数据完整时才执行具体操作……
以上代码在linux、unix下也能运行
/* 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;
}
a为字符数组
strcpy(a,a3);
strcat(a,","); /* 以逗号分隔 */
strcat(a,a6);
strcat(a,"\n"); /* 以回车结束一行 */
fwrite(a,strlen(a),1,fp); /* fp为指向file2的文件指针 */
每次读取数据的时候用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地址字段
/* 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;
}