C语言 用结构体指针 fscanf读取txt文件, 再写入另一个txt文件

原本的题目还要复杂,但本人发现就连读取这一步都是错误的,因此降低难度很紧急,马上就要考试了,这是复习题(上学期考试题),坑爹没有答案啊d.txt文件内有很多内容,格式如下... 原本的题目还要复杂,但本人发现就连读取这一步都是错误的,因此降低难度
很紧急,马上就要考试了,这是复习题(上学期考试题),坑爹没有答案啊
d.txt文件内有很多内容,格式如下(都是一些人物)
******************
HenryVII Tudor 1485
EdwardV Plantagenet 1460
RichardIII Plantagenet 1485
JamesI Stuart 1603
GeorgeI Brunswick-Lunenburg 1707
******************
按照要求我先用建立structure, 然后想用指针把所有数据存储,然后就是很简单的将数据复制到另一个txt文件中。最后一步其实只是为了验证前面没有出错。可是……根本没有可是,完全不能运行。

#include <stdio.h>
#include <stdlib.h>
// 鄙人建立了结构体
typedef struct person
{
char* last;
char* first;
char* year;
}person_t;
int main()
{
int i;
FILE *fp1,*fp2;
person_t *list = malloc(100*sizeof(person_t));
fp1=fopen("d.txt","r");
fp2=fopen("detail.txt","w");
if ((fp1 = fopen("d.txt", "r")) == NULL)
{
printf("Cannot open d.txt!\0");
exit(0);
}

for(i=0;i<5;i++)
{
fscanf(fp1,"%s %s %s\n",list.first+i,list.last+i,list.year+i);
}//我觉得问题应该是出在这里,但是试了几种方法全是报错
for(i=0;i<5;i++)
{
fprintf(fp2,"%s %s %s\n",(list+i)->first,(list+i)->last,(list+i)->year);
}

fclose(fp1);
fclose(fp2);
return 0;
}
BTW要是不用指针大概我也能做,就是要用指针才能符合要求。求救啊!!!!!!!!!
救命啊!!大神们帮帮我吧!!
展开
 我来答
百度网友d585d01
推荐于2016-03-23 · TA获得超过670个赞
知道小有建树答主
回答量:339
采纳率:0%
帮助的人:468万
展开全部
#include <stdio.h>
#include <stdlib.h>
typedef struct person
{
    char* last;
    char* first;
    char* year;
}person_t;
int main()
{
    int i;
    FILE  *fp1,*fp2;
    person_t *list =(person_t*)malloc(100*sizeof(person_t));
    fp1=fopen("d.txt","r");
    fp2=fopen("detail.txt","w");
    if ((fp1 = fopen("d.txt", "r")) == NULL)
 {
  printf("Cannot open d.txt!\n");
  exit(0);
 }

    for(i=0;i<5;i++)
    {
        (list+i)->first=(char*)malloc(sizeof(char)*20);//为你的指针分配空间
(list+i)->last=(char*)malloc(sizeof(char)*20);
(list+i)->year=(char*)malloc(sizeof(char)*20);
fscanf(fp1,"%s %s %s\n",(list+i)->first,(list+i)->last,(list+i)->year);
    }
    for(i=0;i<5;i++)
    {
        fprintf(fp2,"%s %s %s\n",(list+i)->first,(list+i)->last,(list+i)->year);
    }
for(i=0;i<5;i++)
{
free((list+i)->first);//释放空间
free((list+i)->last);
free((list+i)->year);
}
    fclose(fp1);
    fclose(fp2);
    return 0;
}

 如果你不想指定分配的内存长度,你可以按照下面的方法:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct person
{
    char* last;
    char* first;
    char* year;
}person_t;
int main()
{
    int i;
    FILE  *fp1,*fp2;
char str[20];
    person_t *list =(person_t*)malloc(100*sizeof(person_t));
    fp1=fopen("d.txt","r");
    fp2=fopen("detail.txt","w");
    if ((fp1 = fopen("d.txt", "r")) == NULL)
 {
  printf("Cannot open d.txt!\n");
  exit(0);
 }

    for(i=0;i<5;i++)
    {
fscanf(fp1,"%s",str);
(list+i)->first=(char*)malloc(sizeof(char)*(strlen(str)+1));//每次让str存放读取的数据,然后根据str长度malloc内存长度
strcpy((list+i)->first,str);

fscanf(fp1,"%s",str);
(list+i)->last=(char*)malloc(sizeof(char)*(strlen(str)+1));
strcpy((list+i)->last,str);

fscanf(fp1,"%s",str);
(list+i)->year=(char*)malloc(sizeof(char)*(strlen(str)+1));
strcpy((list+i)->year,str);

    }
    for(i=0;i<5;i++)
    {
        fprintf(fp2,"%s %s %s\n",(list+i)->first,(list+i)->last,(list+i)->year);
    }
for(i=0;i<5;i++)
{
free((list+i)->first);//释放空间
free((list+i)->last);
free((list+i)->year);
(list+i)->first=NULL;//防止野指针出现
(list+i)->last=NULL;
(list+i)->year=NULL;
}
    fclose(fp1);
    fclose(fp2);
    return 0;
}
benben239
2014-11-16 · TA获得超过864个赞
知道小有建树答主
回答量:612
采纳率:100%
帮助的人:490万
展开全部

你说的没错,是那里错了

原因是:

你这几个指针根本就没有空间让你读取数据

他只是一个指针变量,只有4个字节的空间

他只负责存储字符的地址

还有最好在最后加个free释放开辟的空间,这是好习惯

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-11-16
展开全部
fscanf(fp1,"%s %s %s\n",list->first+i,list->last+i,list->year+i);
因为list为指针所以只能采用->的方式。其他地方没看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式