c语言中从文件中按行读取字符串,并进行相应操作。
举例:文件aa.txt中有n行数据,格式是字段一\t字段二\t字段三\t字段四\t\n现在我已经将每行数据存放到arr[][]数组中,将(所有)数据字段存放到arr_b[...
举例:文件aa.txt 中有n行数据,格式是 字段一\t字段二\t字段三\t字段四\t\n
现在我已经将每行数据存放到arr[][]数组中,将(所有)数据字段存放到arr_b[][]数组中(arr_b【0】存放的是第一行第一个字段,arr_b【4】存放的是第二行第一个字段....),请问该如何根据字段一进行去重操作,根据字段三进行排序操作呢?
我要将处理后的数据写入到另一个文件中,去重,排序,保留原来格式。去重的意思是,去除重复行 展开
现在我已经将每行数据存放到arr[][]数组中,将(所有)数据字段存放到arr_b[][]数组中(arr_b【0】存放的是第一行第一个字段,arr_b【4】存放的是第二行第一个字段....),请问该如何根据字段一进行去重操作,根据字段三进行排序操作呢?
我要将处理后的数据写入到另一个文件中,去重,排序,保留原来格式。去重的意思是,去除重复行 展开
展开全部
#include "stdafx.h"
#include "stdio.h"
#define ColNum 4 //总列数
#define QCIndex (1-1) //去重列号
#define PXIndex (3-1) //排序列号
typedef struct txtnode{
struct txtnode* next;
char* col[ColNum];
} TXTNODE;
void CopyToNode(TXTNODE*node,char *buf)
{
if(!buf||!*buf) return;
int j,len = strlen(buf);
char *p = (char*)malloc(len+1);
strcpy(p, buf);
node->col[0] = p;
for(j=1; *p&&j<ColNum; p++)
if(*p=='\t')
{
*p++='\0';
if(*p) node->col[j++] = p;
}
if(j<ColNum) node->col[0][0] = '\0';//放弃列数不足的行
}
int findnode(TXTNODE*Head,TXTNODE*node,int colIndex)
{
if(Head)
{
for(TXTNODE*p=Head; p; p=p->next)
if(strcmp(node->col[colIndex], p->col[colIndex])==0) return 1;
}
return 0;
}
int insertNode(TXTNODE**Head,TXTNODE*node,int colIndex)
{
TXTNODE*p0,*p1;
for(p0=NULL,p1=*Head; p1; p0=p1,p1=p1->next)
{
if(strcmp(node->col[colIndex], p1->col[colIndex])>=0)continue; //升序用>=0 降序排则用<=0
if(p0)//插在p0后p1前
{
p0->next=node;
node->next = p1;
}
else//插在开头
{
*Head = node;
node->next = p1;
}
return 0;
}
if(p0)//插在末尾 p1==NULL
{
p0->next=node;
node->next = NULL;
}
else//第一次调用 走到这里
{
*Head = node;
node->next = NULL;
}
return 0;
}
void deleteLink(TXTNODE**Head)
{
TXTNODE *p0,*p1;
p1 = *Head;
while(p1)
{
p0 = p1;
p1=p1->next;
free(p0->col[0]);
free(p0);
}
*Head = NULL;
}
void writeLink(TXTNODE*Head,FILE*wfp)
{
TXTNODE *p0=Head;
int i;
while(p0)
{
for(i=0; i<ColNum-1; i++)
fprintf(wfp,"%s\t",p0->col[i]);
fprintf(wfp,"%s",p0->col[i]);
p0=p0->next;
}
}
TXTNODE* readTxt(FILE*rfp)
{
char buf[10240]={0};
TXTNODE* head=NULL, *tmp;
while(!feof(rfp))
{
fgets(buf,10240,rfp);
if(!*buf) continue;
tmp=(TXTNODE*)malloc(sizeof(TXTNODE));
memset(tmp,0,sizeof(TXTNODE));
CopyToNode(tmp,buf);
if(tmp->col[0][0] && !findnode(head, tmp, QCIndex))
{
insertNode(&head, tmp, PXIndex);
}
else
{
free(tmp->col[0]);
free(tmp);
}
}
return head;
}
void main(int argc,char*argv[])
{
FILE *rfp,*wfp;
TXTNODE*Head = NULL;
if(argc<3){printf("去重排序小程序,调用格式:\n命令名 源文件 目标文件");exit(-1);}
rfp = fopen(argv[1],"rb");
if(rfp==NULL){printf("源文件[%s]打不开",argv[1]);exit(-2);}
wfp = fopen(argv[2],"wb");
if(wfp==NULL){fclose(rfp);printf("目标文件[%s]打不开",argv[2]);exit(-2);}
Head = readTxt(rfp);
writeLink(Head,wfp);
fclose(rfp);
fclose(wfp);
deleteLink(&Head);
printf("处理完毕!\n");
}
//VC7下调试运行通过,功能正常 方便改造
//我闲得蛋痛了,花一两小时时间给你做这小程序(调试费了好一会才通过),没有分送,大大的不值
#include "stdio.h"
#define ColNum 4 //总列数
#define QCIndex (1-1) //去重列号
#define PXIndex (3-1) //排序列号
typedef struct txtnode{
struct txtnode* next;
char* col[ColNum];
} TXTNODE;
void CopyToNode(TXTNODE*node,char *buf)
{
if(!buf||!*buf) return;
int j,len = strlen(buf);
char *p = (char*)malloc(len+1);
strcpy(p, buf);
node->col[0] = p;
for(j=1; *p&&j<ColNum; p++)
if(*p=='\t')
{
*p++='\0';
if(*p) node->col[j++] = p;
}
if(j<ColNum) node->col[0][0] = '\0';//放弃列数不足的行
}
int findnode(TXTNODE*Head,TXTNODE*node,int colIndex)
{
if(Head)
{
for(TXTNODE*p=Head; p; p=p->next)
if(strcmp(node->col[colIndex], p->col[colIndex])==0) return 1;
}
return 0;
}
int insertNode(TXTNODE**Head,TXTNODE*node,int colIndex)
{
TXTNODE*p0,*p1;
for(p0=NULL,p1=*Head; p1; p0=p1,p1=p1->next)
{
if(strcmp(node->col[colIndex], p1->col[colIndex])>=0)continue; //升序用>=0 降序排则用<=0
if(p0)//插在p0后p1前
{
p0->next=node;
node->next = p1;
}
else//插在开头
{
*Head = node;
node->next = p1;
}
return 0;
}
if(p0)//插在末尾 p1==NULL
{
p0->next=node;
node->next = NULL;
}
else//第一次调用 走到这里
{
*Head = node;
node->next = NULL;
}
return 0;
}
void deleteLink(TXTNODE**Head)
{
TXTNODE *p0,*p1;
p1 = *Head;
while(p1)
{
p0 = p1;
p1=p1->next;
free(p0->col[0]);
free(p0);
}
*Head = NULL;
}
void writeLink(TXTNODE*Head,FILE*wfp)
{
TXTNODE *p0=Head;
int i;
while(p0)
{
for(i=0; i<ColNum-1; i++)
fprintf(wfp,"%s\t",p0->col[i]);
fprintf(wfp,"%s",p0->col[i]);
p0=p0->next;
}
}
TXTNODE* readTxt(FILE*rfp)
{
char buf[10240]={0};
TXTNODE* head=NULL, *tmp;
while(!feof(rfp))
{
fgets(buf,10240,rfp);
if(!*buf) continue;
tmp=(TXTNODE*)malloc(sizeof(TXTNODE));
memset(tmp,0,sizeof(TXTNODE));
CopyToNode(tmp,buf);
if(tmp->col[0][0] && !findnode(head, tmp, QCIndex))
{
insertNode(&head, tmp, PXIndex);
}
else
{
free(tmp->col[0]);
free(tmp);
}
}
return head;
}
void main(int argc,char*argv[])
{
FILE *rfp,*wfp;
TXTNODE*Head = NULL;
if(argc<3){printf("去重排序小程序,调用格式:\n命令名 源文件 目标文件");exit(-1);}
rfp = fopen(argv[1],"rb");
if(rfp==NULL){printf("源文件[%s]打不开",argv[1]);exit(-2);}
wfp = fopen(argv[2],"wb");
if(wfp==NULL){fclose(rfp);printf("目标文件[%s]打不开",argv[2]);exit(-2);}
Head = readTxt(rfp);
writeLink(Head,wfp);
fclose(rfp);
fclose(wfp);
deleteLink(&Head);
printf("处理完毕!\n");
}
//VC7下调试运行通过,功能正常 方便改造
//我闲得蛋痛了,花一两小时时间给你做这小程序(调试费了好一会才通过),没有分送,大大的不值
展开全部
#include
"stdafx.h"
#include
"stdio.h"
#define
ColNum
4
//总列数
#define
QCIndex
(1-1)
//去重列号
#define
PXIndex
(3-1)
//排序列号
typedef
struct
txtnode{
struct
txtnode*
next;
char*
col[ColNum];
}
TXTNODE;
void
CopyToNode(TXTNODE*node,char
*buf)
{
if(!buf||!*buf)
return;
int
j,len
=
strlen(buf);
char
*p
=
(char*)malloc(len+1);
strcpy(p,
buf);
node->col[0]
=
p;
for(j=1;
*p&&j<ColNum;
p++)
if(*p=='\t')
{
*p++='\0';
if(*p)
node->col[j++]
=
p;
}
if(j<ColNum)
node->col[0][0]
=
'\0';//放弃列数不足的行
}
int
findnode(TXTNODE*Head,TXTNODE*node,int
colIndex)
{
if(Head)
{
for(TXTNODE*p=Head;
p;
p=p->next)
if(strcmp(node->col[colIndex],
p->col[colIndex])==0)
return
1;
}
return
0;
}
int
insertNode(TXTNODE**Head,TXTNODE*node,int
colIndex)
{
TXTNODE*p0,*p1;
for(p0=NULL,p1=*Head;
p1;
p0=p1,p1=p1->next)
{
if(strcmp(node->col[colIndex],
p1->col[colIndex])>=0)continue;
//升序用>=0
降序排则用<=0
if(p0)//插在p0后p1前
{
p0->next=node;
node->next
=
p1;
}
else//插在开头
{
*Head
=
node;
node->next
=
p1;
}
return
0;
}
if(p0)//插在末尾
p1==NULL
{
p0->next=node;
node->next
=
NULL;
}
else//第一次调用
走到这里
{
*Head
=
node;
node->next
=
NULL;
}
return
0;
}
void
deleteLink(TXTNODE**Head)
{
TXTNODE
*p0,*p1;
p1
=
*Head;
while(p1)
{
p0
=
p1;
p1=p1->next;
free(p0->col[0]);
free(p0);
}
*Head
=
NULL;
}
void
writeLink(TXTNODE*Head,FILE*wfp)
{
TXTNODE
*p0=Head;
int
i;
while(p0)
{
for(i=0;
i<ColNum-1;
i++)
fprintf(wfp,"%s\t",p0->col[i]);
fprintf(wfp,"%s",p0->col[i]);
p0=p0->next;
}
}
TXTNODE*
readTxt(FILE*rfp)
{
char
buf[10240]={0};
TXTNODE*
head=NULL,
*tmp;
while(!feof(rfp))
{
fgets(buf,10240,rfp);
if(!*buf)
continue;
tmp=(TXTNODE*)malloc(sizeof(TXTNODE));
memset(tmp,0,sizeof(TXTNODE));
CopyToNode(tmp,buf);
if(tmp->col[0][0]
&&
!findnode(head,
tmp,
QCIndex))
{
insertNode(&head,
tmp,
PXIndex);
}
else
{
free(tmp->col[0]);
free(tmp);
}
}
return
head;
}
void
main(int
argc,char*argv[])
{
FILE
*rfp,*wfp;
TXTNODE*Head
=
NULL;
if(argc<3){printf("去重排序小程序,调用格式:\n命令名
源文件
目标文件");exit(-1);}
rfp
=
fopen(argv[1],"rb");
if(rfp==NULL){printf("源文件[%s]打不开",argv[1]);exit(-2);}
wfp
=
fopen(argv[2],"wb");
if(wfp==NULL){fclose(rfp);printf("目标文件[%s]打不开",argv[2]);exit(-2);}
Head
=
readTxt(rfp);
writeLink(Head,wfp);
fclose(rfp);
fclose(wfp);
deleteLink(&Head);
printf("处理完毕!\n");
}
//VC7下调试运行通过,功能正常
方便改造
//我闲得蛋痛了,花一两小时时间给你做这小程序(调试费了好一会才通过),没有分送,大大的不值
"stdafx.h"
#include
"stdio.h"
#define
ColNum
4
//总列数
#define
QCIndex
(1-1)
//去重列号
#define
PXIndex
(3-1)
//排序列号
typedef
struct
txtnode{
struct
txtnode*
next;
char*
col[ColNum];
}
TXTNODE;
void
CopyToNode(TXTNODE*node,char
*buf)
{
if(!buf||!*buf)
return;
int
j,len
=
strlen(buf);
char
*p
=
(char*)malloc(len+1);
strcpy(p,
buf);
node->col[0]
=
p;
for(j=1;
*p&&j<ColNum;
p++)
if(*p=='\t')
{
*p++='\0';
if(*p)
node->col[j++]
=
p;
}
if(j<ColNum)
node->col[0][0]
=
'\0';//放弃列数不足的行
}
int
findnode(TXTNODE*Head,TXTNODE*node,int
colIndex)
{
if(Head)
{
for(TXTNODE*p=Head;
p;
p=p->next)
if(strcmp(node->col[colIndex],
p->col[colIndex])==0)
return
1;
}
return
0;
}
int
insertNode(TXTNODE**Head,TXTNODE*node,int
colIndex)
{
TXTNODE*p0,*p1;
for(p0=NULL,p1=*Head;
p1;
p0=p1,p1=p1->next)
{
if(strcmp(node->col[colIndex],
p1->col[colIndex])>=0)continue;
//升序用>=0
降序排则用<=0
if(p0)//插在p0后p1前
{
p0->next=node;
node->next
=
p1;
}
else//插在开头
{
*Head
=
node;
node->next
=
p1;
}
return
0;
}
if(p0)//插在末尾
p1==NULL
{
p0->next=node;
node->next
=
NULL;
}
else//第一次调用
走到这里
{
*Head
=
node;
node->next
=
NULL;
}
return
0;
}
void
deleteLink(TXTNODE**Head)
{
TXTNODE
*p0,*p1;
p1
=
*Head;
while(p1)
{
p0
=
p1;
p1=p1->next;
free(p0->col[0]);
free(p0);
}
*Head
=
NULL;
}
void
writeLink(TXTNODE*Head,FILE*wfp)
{
TXTNODE
*p0=Head;
int
i;
while(p0)
{
for(i=0;
i<ColNum-1;
i++)
fprintf(wfp,"%s\t",p0->col[i]);
fprintf(wfp,"%s",p0->col[i]);
p0=p0->next;
}
}
TXTNODE*
readTxt(FILE*rfp)
{
char
buf[10240]={0};
TXTNODE*
head=NULL,
*tmp;
while(!feof(rfp))
{
fgets(buf,10240,rfp);
if(!*buf)
continue;
tmp=(TXTNODE*)malloc(sizeof(TXTNODE));
memset(tmp,0,sizeof(TXTNODE));
CopyToNode(tmp,buf);
if(tmp->col[0][0]
&&
!findnode(head,
tmp,
QCIndex))
{
insertNode(&head,
tmp,
PXIndex);
}
else
{
free(tmp->col[0]);
free(tmp);
}
}
return
head;
}
void
main(int
argc,char*argv[])
{
FILE
*rfp,*wfp;
TXTNODE*Head
=
NULL;
if(argc<3){printf("去重排序小程序,调用格式:\n命令名
源文件
目标文件");exit(-1);}
rfp
=
fopen(argv[1],"rb");
if(rfp==NULL){printf("源文件[%s]打不开",argv[1]);exit(-2);}
wfp
=
fopen(argv[2],"wb");
if(wfp==NULL){fclose(rfp);printf("目标文件[%s]打不开",argv[2]);exit(-2);}
Head
=
readTxt(rfp);
writeLink(Head,wfp);
fclose(rfp);
fclose(wfp);
deleteLink(&Head);
printf("处理完毕!\n");
}
//VC7下调试运行通过,功能正常
方便改造
//我闲得蛋痛了,花一两小时时间给你做这小程序(调试费了好一会才通过),没有分送,大大的不值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2017-09-24
展开全部
用fgets()就可以实现;
参考如下:
FILE *fp;
char str[256];
fgets(str, 256, fp);
意思为从fp中读一行,放入str中;
如果需要记录行号的话,设定个量计数就可以。
参考如下:
FILE *fp;
char str[256];
fgets(str, 256, fp);
意思为从fp中读一行,放入str中;
如果需要记录行号的话,设定个量计数就可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用数组的话去重可以向后搜索,遇到空的跳过、重复的删除(变为空)。
但是排序很困难呢。
建议使用动态链表,这样去重,排序都非常方便
但是排序很困难呢。
建议使用动态链表,这样去重,排序都非常方便
追问
其实我早就想用的,由于是新手初学,哎。。后悔了,我现在用数组做的差不多了,再改就不大好了,其实用动态链表的话很简单的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
去重:依次比较每两个数组,如果有重复的将其中一个做标记,表示是重复的,在最后需要写入另一文件中时,只要依次写入每条记录,碰到有标记的就不写入即可。注意标记应与所有数据不相同的。
排序:对字段三进行排序,方法自选,简单的就是冒泡排序,只是每次比较字段三的数据,然后对换这一行信息内容,比如,如果按照自小到大顺序排,i<j,arr_b[i][2]>arr_b[j][2],就将arr_b[i]和arr_b[j]都对换就可以了。
排序:对字段三进行排序,方法自选,简单的就是冒泡排序,只是每次比较字段三的数据,然后对换这一行信息内容,比如,如果按照自小到大顺序排,i<j,arr_b[i][2]>arr_b[j][2],就将arr_b[i]和arr_b[j]都对换就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询