如何把文件里面每个@之间的字符提取出来存到字符组里面(不留@)

img


如何把文件里面每个@之间的字符提取出来存到字符组里面(不留@),而且能每一行顺序读取

如果文件是图片所示的格式,可以先定义一个结构存储每行各字段的信息,然后循环读取每行,然后按格式解析每行的数据存入结构数组中的相应行的各字段,最后打印结构数组的信息即可。

代码如下:

参考链接:


#include <stdio.h>
#include <stdlib.h> // malloc()
struct phoneBook{  // 存储每行数据的结构 
    
    char name[20]; // 姓名 
    char phone[20]; // 电话号码 
    char address[50]; // 地址 
    char remark[50]; // 备注 
};

int main(void){
    
    FILE * fp = fopen("f:\\电话簿.txt","r"); // 此处填入电话簿.txt文件的地址 
    if(fp==NULL){
        printf("文件打开失败,程序退出!\n");
        return -1;
    }
    
    int num=0;
    char temp[256];
    while(feof(fp)==0){     //读取文件,确定行数    
        fscanf(fp,"%s",temp);
        num++;
    } 
//    printf("num=%d\n",num); 
    
    
    // 申请num行文件所需的结构空间 
    struct phoneBook * pbs = (struct phoneBook*)malloc(sizeof(struct phoneBook)*num); 
    int i=0;
    // https://baike.baidu.com/item/rewind/6391452?fr=aladdin
    rewind(fp);  // 让指针重新指向文件开头 
    while(feof(fp)==0){        
        fscanf(fp,"%s",temp); // 读取不间断的一行文件 
        
    //    printf("temp=%s\n",temp) ;
        
        int j=0;
        int k=0;
        while(temp[k]!='@'){ // 读取第一个@前的字符到名字字符数组 
            pbs[i].name[j]=temp[k];    
            k++;
            j++;
        }
        pbs[i].name[j]='\0';
    //    printf("name,k=%d,j=%d\n",k,j);
        
        k++;         
        j=0;
        while(temp[k]!='@'){  // 读取第一个@后到第二个@前的字符到电话号码字符数组 
            pbs[i].phone[j]=temp[k];    
            k++;
            j++;
        }
        pbs[i].phone[j]='\0';
    //    printf("phone,k=%d,j=%d\n",k,j); 
            
        
        k++;    
        j=0;
        while(temp[k]!='@'){  // 读取第二个@后到第三个@前的字符到家庭住址字符数组 
            pbs[i].address[j]=temp[k];    
            k++;
            j++;
        }
        pbs[i].address[j]='\0';
    //    printf("address,k=%d,j=%d\n",k,j); 
        
        k++;
        j=0;
        while(temp[k]!='\0'){  //读取第三个@后到结尾空字符之前的字符到备注字符数组 
            pbs[i].remark[j]=temp[k];    
            k++;
            j++;
        }
        pbs[i].remark[j]='\0';
    //    printf("remark,k=%d,j=%d\n",k,j); 
        
        i++;
    }
    fclose(fp);
    
    // 打印结果 
    printf("文件中的信息为:\n");
    int j;
    for(j=0;j<i;j++){
        printf("姓名:%s, 电话号码: %s,家庭住址:%s,备注:%s\n",pbs[j].name,pbs[j].phone,pbs[j].address,pbs[j].remark);
    }
    free(pbs);
    pbs=NULL;
    
    
    return 0;
    
} 

电话簿.txt(测试文件内容,以ANSI编码方式保存):

田二@13812345678@北京@帝都
张三@15112345678@上海@魔都
李四@15612345678@广州@妖都
王五@13212345678@深圳@梦都

img

您可以使用以下Python代码来提取文件中每个@之间的字符,并将其存储到一个列表中:

with open('filename.txt', 'r') as f:
    lines = f.readlines()
    result = []
    for line in lines:
        data = line.strip().split('@')
        for d in data:
            if d != '':
                result.append(d)
print(result)

该代码假定文件名为filename.txt,文件中每行可能包含多个以@为分隔符的字符串。

首先,使用with open()语句打开文件,并使用readlines()方法读取所有行。

然后,对于每行,使用strip()方法删除行首和行尾的空格和换行符,并使用split()方法按@分割字符串。此操作将返回一个包含多个子字符串的列表。

接下来,使用一个循环遍历该列表,并将每个子字符串添加到result列表中(排除空字符串)。

最后,result列表将包含所有提取的子字符串,可以按顺序逐个读取和使用。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^