c语言中从文件中按行读取字符串,并进行相应操作。

2024-11-02 14:13:13
推荐回答(5个)
回答1:

#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 if(*p=='\t')
{
*p++='\0';
if(*p) node->col[j++] = p;
}
if(jcol[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 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下调试运行通过,功能正常 方便改造
//我闲得蛋痛了,花一两小时时间给你做这小程序(调试费了好一会才通过),没有分送,大大的不值

回答2:

#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&&jp++)
if(*p=='\t')
{
*p++='\0';
if(*p)
node->col[j++]
=
p;
}
if(jnode->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;
ii++)
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下调试运行通过,功能正常
方便改造
//我闲得蛋痛了,花一两小时时间给你做这小程序(调试费了好一会才通过),没有分送,大大的不值

回答3:

用fgets()就可以实现;

参考如下:
FILE *fp;
char str[256];
fgets(str, 256, fp);
意思为从fp中读一行,放入str中;
如果需要记录行号的话,设定个量计数就可以。

回答4:

使用数组的话去重可以向后搜索,遇到空的跳过、重复的删除(变为空)。
但是排序很困难呢。

建议使用动态链表,这样去重,排序都非常方便

回答5:

去重:依次比较每两个数组,如果有重复的将其中一个做标记,表示是重复的,在最后需要写入另一文件中时,只要依次写入每条记录,碰到有标记的就不写入即可。注意标记应与所有数据不相同的。
排序:对字段三进行排序,方法自选,简单的就是冒泡排序,只是每次比较字段三的数据,然后对换这一行信息内容,比如,如果按照自小到大顺序排,iarr_b[j][2],就将arr_b[i]和arr_b[j]都对换就可以了。