如何从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
将其拆分为字段。