如何从c中使用正则表达式写入文件的\t\t中读取一个
我编写了以下代码来从文件中读取数据,该文件的数据如下:如何从c中使用正则表达式写入文件的\t\t中读取一个,c,C,我编写了以下代码来从文件中读取数据,该文件的数据如下: Anita Shah F国民大会党NCP 印度国民大会公司 印度人民党 Rakesh Bhardwaj M IND 桑杰舒克拉M公司 代码是: #include<stdio.h> #include<stdlib.h> struct node { char cand_name[50],cand_sex,partyname[60],partyabbre[5]; struct node *next; }
Anita Shah F国民大会党NCP
印度国民大会公司
印度人民党
Rakesh Bhardwaj M IND
桑杰舒克拉M公司
代码是:
#include<stdio.h>
#include<stdlib.h>
struct node
{
char cand_name[50],cand_sex,partyname[60],partyabbre[5];
struct node *next;
};
typedef struct node NODE;
NODE* getnode(void)
{
NODE *nnode;
nnode=(NODE *)malloc(sizeof(NODE));
nnode->next=NULL;
return nnode;
}
void display(NODE *head)
{
NODE *cur;
cur=head;
int i=1;
while(cur!=NULL)
{
printf("%d. %s\t%c\t%s\t%s\n",i,cur->cand_name,cur->cand_sex,cur->partyname,cur->partyabbre);
fflush(stdout);
cur=cur->next;
i++;
}
}
main()
{
FILE *fp;
NODE *start,*cur;
fp=fopen("data.txt","r");
cur=getnode();
start=cur;
fscanf(fp,"%[^\t]\t%c\t%[^\t]\t%s\n",cur->cand_name,&cur->cand_sex,cur->partyname,cur->partyabbre);
while(!feof(fp))
{
cur->next=getnode();
cur=cur->next;
fscanf(fp,"%[^\t]\t%c\t%[^\t]\t%s\n",cur->cand_name,&cur->cand_sex,cur->partyname,cur->partyabbre);
}
display(start);
}
#包括
#包括
结构节点
{
char cand_name[50]、cand_sex、partyname[60]、partyabbre[5];
结构节点*下一步;
};
typedef结构节点;
节点*getnode(无效)
{
节点*nnode;
nnode=(NODE*)malloc(sizeof(NODE));
nnode->next=NULL;
返回nnode;
}
无效显示(节点*头部)
{
节点*cur;
cur=头部;
int i=1;
while(cur!=NULL)
{
printf(“%d.%s\t%c\t%s\t%s\n”,i,cur->cand\u name,cur->cand\u sex,cur->partyname,cur->partyabbre);
fflush(stdout);
cur=cur->next;
i++;
}
}
main()
{
文件*fp;
节点*开始,*当前;
fp=fopen(“data.txt”,“r”);
cur=getnode();
开始=当前;
fscanf(fp,“%[^\t]\t%c\t%[^\t]\t%s\n”,cur->cand\u name,&cur->cand\u sex,cur->partyname,cur->partyabbre);
而(!feof(fp))
{
cur->next=getnode();
cur=cur->next;
fscanf(fp,“%[^\t]\t%c\t%[^\t]\t%s\n”,cur->cand\u name,&cur->cand\u sex,cur->partyname,cur->partyabbre);
}
显示(启动);
}
对于文件中的第四个条目,我希望
cur->prtyname
为空,但我的代码将cur->partyname
作为索引。使用fgets
读取整行。使用strcspn
分析行。为子字符串使用数组(sub[3][100]
)简化了while循环
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main( void) {
char tab[] = { "one\x9\x9three"};
char sub[3][100] = { "\0"};
int length = 0;
int offset = 0;
int used = 0;
int item = 0;
length = strlen ( tab);
while ( used < length) {
offset = strcspn ( &tab[used], "\t");//find a tab
if ( offset < 99) {
memcpy ( sub[item], &tab[used], offset);
sub[item][offset] = '\0';
}
else {//substring longer than available space of 100
memcpy ( sub[item], &tab[used], 99);
sub[item][99] = '\0';
}
used += offset + 1;
item++;
if ( item >= 3) {//too many items. only 3 provided for
break;
}
}
//print the three substrings.
printf ( "sub[0] %s\n", sub[0]);
printf ( "sub[1] %s\n", sub[1]);
printf ( "sub[2] %s\n", sub[2]);
return 0;
}
#包括
#包括
#包括
内部主(空){
字符选项卡[]={“一个\x9\x9three”};
char sub[3][100]={“\0”};
整数长度=0;
整数偏移=0;
int=0;
int项=0;
长度=strlen(制表符);
while(使用时<长度){
offset=strcspn(&tab[已使用],“\t”);//查找选项卡
如果(偏移量<99){
memcpy(子[项目],&选项卡[已使用]、偏移量);
子[项目][抵销]='\0';
}
else{//子字符串的长度超过可用空间100
memcpy(子[项目],&选项卡[已使用],99);
分[项目][99]=“0”;
}
已用+=偏移量+1;
项目++;
如果(项>=3){//项太多。仅为3项提供
打破
}
}
//打印三个子字符串。
printf(“sub[0]%s\n”,sub[0]);
printf(“sub[1]%s\n”,sub[1]);
printf(“sub[2]%s\n”,sub[2]);
返回0;
}
fscanf
很可能不是解决此问题的正确工具。它只是忽略了留空的“字段”。例如,使用fgets
阅读整行内容,并使用strchr
将其拆分为字段。