如果文件是图片所示的格式,可以先定义一个结构存储每行各字段的信息,然后循环读取每行,然后按格式解析每行的数据存入结构数组中的相应行的各字段,最后打印结构数组的信息即可。
代码如下:
参考链接:
#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@深圳@梦都
您可以使用以下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列表将包含所有提取的子字符串,可以按顺序逐个读取和使用。
不知道你这个问题是否已经解决, 如果还没有解决的话: