C语言 用结构体指针 fscanf读取txt文件, 再写入另一个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要是不用指针大概我也能做,就是要用指针才能符合要求。求救啊!!!!!!!!!
救命啊!!大神们帮帮我吧!!

#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;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-11-16

你说的没错,是那里错了

原因是:

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

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

他只负责存储字符的地址

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

第2个回答  2014-11-16
fscanf(fp1,"%s %s %s\n",list->first+i,list->last+i,list->year+i);
因为list为指针所以只能采用->的方式。其他地方没看。

c语言可以读取文件内容 来创建变量吗?
c语言可以利用fscanf和sscanf两个函数 读取txt文件内容并写入到变量里面。scanf:可以自动识别换行符和空格符 (1)fscanf可以读取txt文件里面同一行多个变量和不同行的变量都同时读取到多个变量里面。(2)sscanf是先读取到一个缓存里面,然后再赋值到各个变量中,是逐行读取的,这种用法适用于多维变量。1. C...

c语言入门代码009 从 txt 文本文件中加载数据到结构体数组
第一步,通过fopen函数以读取模式打开文件,准备从文件头部获取数据。第二步,文件中逐个读取结构体字段,并将数据保存到数组中,直到文件结尾。feof函数用于检测文件是否达到末尾,判断是否需要结束循环。在读取数据时,使用fscanf函数,与scanf相似,但添加了文件指针参数,用于在文件内容中执行读取操作。数据...

C语言怎样将.txt文件中的数据写入到结构体中去
int main(){ FILE *data;\/\/要读取的文件指针 int i=0;\/\/结构题数组移动 struct wordUnit words[DATALEN];if((data=fopen("data3.txt","r"))==NULL){ printf("Can not open file\\n");return 0;} while(!feof(data)){ \/\/原txt文档的数据之间是以空格隔开的 } fclose(data);for(in...

怎么用C++从一个txt里面读取数据然后存放到链表中进行各种操作 最后...
char birth[10];struct informationTable *next;}INFO ,*pINFO;\/\/ 结构体 int main(int argc, char *argv[]){ FILE *pf;char scrname[20] = {0}, desname[20] = {0};pINFO head, tail, tmp;printf("Enter Input Filename:");gets(scrname);printf("Enter Output Filename:");gets...

c语言读取txt文档并将内容存放到表里
而写指的是:将程序中的信息写入到文件,如txt文件。是一种 内存信息->硬盘信息 的转化方式 对于你的问题,则是 读 的方式,二、具体使用方法 在C语言中,读文件的需要用到文件类型 FILE;通常的使用方式为: FILE *fp;定义一个文件指针;用指针打开文件的函数为:fp = fopen("mm.txt","w"...

c语言中文件的读与写的问题,涉及fscanf,fwrite函数 程序如下 (先上30...
1 不管是什么 w也好 wb也好 你写的时候用的是fwrite 就是二进制写入 必须要用fread来读入,直接打开文件看 有乱码很正常 当然 如果你能在给结构体赋值前把结构体内容初始化一下 就没有乱码了 2 fscanf 跟scanf一样的 多少个空格都按一个算 不以空格换行 是流的模式 你懂吗 3 见我1里面的...

如何将txt文件中的学生信息读取到结构体数组中,C语言
FILE *fp;printf("请输入文件名,路径:"); \/\/打开txt文件scanf("%s",filename);if((fp = fopen(filename,"r")) == NULL) {fprintf(stderr,"%s 文件打开失败!\\n",filename);exit(0); } for(int i=0; i<12; i++) \/\/循环读取{ fscanf(fp,"%s%s%f",StuInfo[i].I...

C语言中把文件里面的几组数据依次读出来分别赋值给几个结构体变量(用链...
fread(buf,size,count,fp);\/\/buf输入数据起始地址,size 每个数据块的大小,count 每次写入的数据块个数,fp 文件指针 写好后是:while(!feof(fp)){ fread(&temp[i],sizeof(struct use),1,fp);\/\/这个读出来放数组里面 i++;} 问题是你读的是txt文件,完全可以用fscanf()函数么。

c++中fopen函数读文件怎么用文件数据?
\\x0d\\x0a一、C文件操作:\\x0d\\x0a C语言中,文件的操作都是通过一个FILE类型的文件指针进行,也就是说只有通过文件指针,才能调用相应的文件。FILE是一个由系统定义的结构体(定义在stdio.h中),可以存放文件的相关信息。\\x0d\\x0a文件的打开(fopen函数)\\x0d\\x0a 文件的操作过程一般...

C语言结构体读取txt文件中内容,有逗号
用字符读出,判断是否为‘,’,是的话就转化为结构体中的一个变量值,再读取判断,直到都读出来。写入文件的时候每个数据的字节数都是定好的,直接读取一行,然后用memcpy(char* des,char* str,int n)读取,memcpy(des,str+n,m);从第n个字节读m个字节。两种都可以,第二种读字符串的时候有...

相似回答