结构体中含有指针,并写入文件,该如何读取

mybaobaozhaoyangxing 2015-02-15 11:40:27
从文件中读出一篇英文文章,若干行,每行最多不超过80个字符。首次运行时都不会出错,关闭重新运行就乱了,感觉是指针、分配的内存空间的问题,但是因为不知字符个数多少还是得用到指针。全部贴出来了,能不能帮忙运行一下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <fstream.h>
#define N 100
typedef struct lnode
{
char data;
struct lnode *next;
}Linklist;
Linklist *Par[N];

struct paragraph
{
char *para;//每段写入字符个数不确定,所以用指针,能动态解决这一问题
int count;//每段字符个数
};
struct paragraph *par;
FILE *fp;
int k=0;//记录段数
int i=0;
//存入文件的仅仅是储存链表的数据部分,需要时,从文件中提取数据,重新建立一个新的链表。
//每一段内容由单链表构成,每一个表头结点指向单链表的第一个节点,所有表头结点又组成一个数组

void First()//每次重新运行时,由这个函数能得知已写入文件有几段内容
{
if((fp=fopen("D:\\c\\a.txt","r"))==NULL)
{
printf("没有该文件\n");
return;
}
else
{
fp=fopen("D:\\c\\a.txt","r");
for(i=0;i<N;i++)
{
if(fread(&par[i],sizeof(struct paragraph),1,fp)!=NULL) //这个地方不知如何处理
//if(fread(&par[i].count,sizeof(int),1,fp)!=0)
{
printf("%d ",par[i].count);
k++;
}
else
{
break;
}
}
printf("\n**已存在%d段内容\n",k);
}
fclose(fp);
}
void Write()
{
int n=0;//记录每段字符数
int n1=0;
int n2=0;
int n3=0;
printf("请输入文章:\n");
char c;
Linklist *L;
Linklist *p;
Linklist *s;
L=(Linklist *)malloc(sizeof(Linklist));
while(1)//只要未输入Ctrl+E,即不断输入字符
{
c=getchar();
if(c!=10 && c!=5)//继续写入当前段落的内容
{
n++;
s=(Linklist *)malloc(sizeof(Linklist));
s->data=c;
s->next=NULL;
if(n==1)
{
L->next=s;
Par[k]=L;
}
else
{
p->next=s;
}
p=s;
}
if((c==10||c==5)&& n!=0)
{
n1=n/80;//行数即‘\n’数
n2=n+n1;
n3=n2+5;
par[k].para=(char *)malloc(n3*sizeof(char));
par[k].count=(int)malloc(sizeof(int));
p=Par[k]->next;
for(i=0;i<n2;i++)//将字符传入数组
{
if((i+1)%81==0)
{
par[k].para[i]='\n';
}
else
{
par[k].para[i]=p->data;
p=p->next;
}
}
par[k].count=n;
fp=fopen("D:\\c\\a.txt","a+");
fwrite(&par[k],sizeof(struct paragraph),1,fp);
// fwrite(par[k].para,n2*sizeof(char),1,fp);
// fwrite(&par[k].count,sizeof(int),1,fp);
fprintf(fp,"\n");
fclose(fp);
k++;
n=0;
if(c==5)//Ctrl+E提示文章输入结束
{
printf("文章输入完毕!\n");
break;
}
}
}
}
void Read()
{
int j=0;
int n;
int n1;
int n2;
int n3;
fp=fopen("D:\\c\\a.txt","r");
for(i=0;i<=k;i++)
{
n=par[i].count;
n1=n/80;
n2=n+n1;
n3=n2+5;
fread(&par[k],sizeof(struct paragraph),1,fp);
// fread(par[i].para,n3*sizeof(char),1,fp);
for(j=0;j<n2;j++)
{
if((j+1)%80==0)
{
j++;
}
else
{
printf("%c",par[i].para[j]);//调试时这里会处错误,可能是第二次运行时,第一次分配的空间释放了,不知如何处理
}
}
printf("\n");
}
for(i=0;i<k;i++)
{
printf("%d ",par[i].count);
}
fclose(fp);
printf("\n");
}

void main()
{
par=(struct paragraph *)malloc(N*sizeof(struct paragraph));
First();
printf("写入请按1\n");
printf("读出请按2\n");
printf("退出请按0\n");
int a;
printf("请选择:");
scanf("%d",&a);
while(a!=0)
{
switch(a)
{
case 0:break;
case 1:Write();
break;
case 2:Read();
break;
default:printf("错误!\n");
}
printf("请选择:");
scanf("%d",&a);
}
}


1.写入部分用fwrite(&par[k],sizeof(struct paragraph),1,fp); 读出和first()中用fread(&par[k],sizeof(struct paragraph),1,fp);
未结束时一切都正确,存入文件的是乱码;重新运行时段落k正确,但读出时还是会有错
2.写入部分用fwrite(par[k].para,n2*sizeof(char),1,fp); fwrite(&par[k].count,sizeof(int),1,fp);
读出部分:fread(par[i].para,n3*sizeof(char),1,fp);文件中显示正确字符,关闭重新运行时无论first()函数中如何写,段落k都会出错
...全文
514 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
BrillianceRen 2015-02-15
  • 打赏
  • 举报
回复
你的程序写的一塌糊涂, 本想给你改改, 看了一会果断放弃了.... 给你修改比重新写一个还累, 等晚上有空再说吧
BrillianceRen 2015-02-15
  • 打赏
  • 举报
回复
引用
您好,我还是有些地方不清楚,难道fwrite之后就得将指针free掉,fread的时候再给指针分配空间?这样好像不行啊 我的程序初次运行时没有错误,数据内容感觉都正确的写入文件了,但是关闭后再次运行时,它连par[i].count数值都错了,这是为什么呢?还有如果这时给指针分配空间,感觉也读不出文件里的内容 麻烦你了,谢谢~
1. 运行时数据存放在内存中, malloc, free操作是针对内存的操作, 你创建的局部变量, 全局变量等等都是存放在内存中, 程序重启或者内存掉电都会重新分配内存. 2. fwrite和fread是IO接口, 读写的是存储设备,也就是掉电或者程序重启不会丢失数据的东西. 当你的程序重新启动后, 结构中的para指针指向的数据已经不复存在, 即便你知道你上一次运行程序时的内存地址, 也读不到原来的数据了. 因此需要将数据按可读可写的规则存放在存储设备中, 以备下次使用. 事实上我给出的那个方案真的很简单. 由两部分组成的一条协议, 第一部分是4个字节长度, 存放的是第二部分的长度, 第二部分是不定长的一堆数据. 因为是fread和fwrite是FIFO的, 因此一定要先写第一部分, 再写第二部分. 读的时候先读第一部分, 再读第二部分. 如果这样还不能解释... 我黔驴技穷了.
BrillianceRen 2015-02-15
  • 打赏
  • 举报
回复
首先, 你这个结构体
引用
struct paragraph { char *para;//每段写入字符个数不确定,所以用指针,能动态解决这一问题 int count;//每段字符个数 };
大小为8个字节, 也就是说 sizeof(struct paragraph) 等于8. 这里读出来的count是有效的, para是无效的. 我就说一下简单的存取这个结构的思路. 1. 写
//struct paragraph st = xxx;
fwrite(&st .count, 4, 1, p_file);
fwrite(st.para, st .count, 1, p_file);
2.读
struct paragraph st = {0};
fread(&st.count, 4, 1, p_file);
st.para= (char*)malloc(st.count);
fread(st.para, st.count, 1, p_file);
The C programming Language 第二版英文版 內容列表 Table of Contents Preface.......................................................... Preface to the first edition..................................... Introduction..................................................... Chapter 1 - A Tutorial Introduction.............................. 1.1 Getting Started................................ 1.2 Variables and Arithmetic Expressions........... 1.3 The for statement.............................. 1.4 Symbolic Constants............................. 1.5 Character Input and Output..................... 1.5.1 File Copying.......................... 1.5.2 Character Counting.................... 1.5.3 Line Counting......................... 1.5.4 Word Counting......................... 1.6 Arrays......................................... 1.7 Functions...................................... 1.8 Arguments - Call by Value...................... 1.9 Character Arrays............................... 1.10 External Variables and Scope.................. Chapter 2 - Types, Operators and Expressions..................... 2.1 Variable Names................................. 2.2 Data Types and Sizes........................... 2.3 Constants...................................... 2.4 Declarations................................... 2.5 Arithmetic Operators........................... 2.6 Relational and Logical Operators............... 2.7 Type Conversions............................... 2.8 Increment and Decrement Operators.............. 2.9 Bitwise Operators.............................. 2.10 Assignment Operators and Expressions.......... 2.11 Conditional Expressions....................... 2.12 Precedence and Order of Evaluation............ Chapter 3 - Control Flow......................................... 3.1 Statements and Blocks.......................... 3.2 If-Else........................................ 3.3 Else-If........................................ 3.4 Switch......................................... 3.5 Loops - While and For.......................... 3.6 Loops - Do-While............................... 3.7 Break and Continue............................. 3.8 Goto and labels................................ Chapter 4 - Functions and Program Structure...................... 4.1 Basics of Functions............................ 4.2 Functions Returning Non-integers............... 4.3 External Variables............................. 4.4 Scope Rules.................................... 4.5 Header Files................................... 4.6 Static Variables................................ 4.7 Register Variables.............................. 4.8 Block Structure................................. 4.9 Initialization.................................. 4.10 Recursion...................................... 4.11 The C Preprocessor............................. 4.11.1 File Inclusion........................ 4.11.2 Macro Substitution.................... 4.11.3 Conditional Inclusion................. Chapter 5 - Pointers and Arrays.................................. 5.1 Pointers and Addresses......................... 5.2 Pointers and Function Arguments................ 5.3 Pointers and Arrays............................ 5.4 Address Arithmetic............................. 5.5 Character Pointers and Functions............... 5.6 Pointer Arrays; Pointers to Pointers........... 5.7 Multi-dimensional Arrays....................... 5.8 Initialization of Pointer Arrays............... 5.9 Pointers vs. Multi-dimensional Arrays.......... 5.10 Command-line Arguments........................ 5.11 Pointers to Functions......................... 5.12 Complicated Declarations...................... Chapter 6 - Structures........................................... 6.1 Basics of Structures........................... 6.2 Structures and Functions....................... 6.3 Arrays of Structures........................... 6.4 Pointers to Structures......................... 6.5 Self-referential Structures.................... 6.6 Table Lookup................................... 6.7 Typedef........................................ 6.8 Unions......................................... 6.9 Bit-fields..................................... Chapter 7 - Input and Output..................................... 7.1 Standard Input and Output....................... 7.2 Formatted Output - printf....................... 7.3 Variable-length Argument Lists.................. 7.4 Formatted Input - Scanf......................... 7.5 File Access..................................... 7.6 Error Handling - Stderr and Exit................ 7.7 Line Input and Output........................... 7.8 Miscellaneous Functions......................... 7.8.1 String Operations...................... 7.8.2 Character Class Testing and Conversion. 7.8.3 Ungetc................................. 7.8.4 Command Execution...................... 7.8.5 Storage Management..................... 7.8.6 Mathematical Functions................. 7.8.7 Random Number generation............... Chapter 8 - The UNIX System Interface............................ 8.1 File Descriptors............................... 8.2 Low Level I/O - Read and Write................. 8.3 Open, Creat, Close, Unlink..................... 8.4 Random Access - Lseek.......................... 8.5 Example - An implementation of Fopen and Getc.. 8.6 Example - Listing Directories.................. 8.7 Example - A Storage Allocator.................. Appendix A - Reference Manual.................................... A.1 Introduction................................... A.2 Lexical Conventions............................ A.2.1 Tokens................................ A.2.2 Comments.............................. A.2.3 Identifiers........................... A.2.4 Keywords.............................. A.2.5 Constants............................. A.2.6 String Literals....................... A.3 Syntax Notation................................ A.4 Meaning of Identifiers......................... A.4.1 Storage Class......................... A.4.2 Basic Types........................... A.4.3 Derived types......................... A.4.4 Type Qualifiers....................... A.5 Objects and Lvalues............................ A.6 Conversions.................................... A.6.1 Integral Promotion.................... A.6.2 Integral Conversions.................. A.6.3 Integer and Floating.................. A.6.4 Floating Types........................ A.6.5 Arithmetic Conversions................ A.6.6 Pointers and Integers................. A.6.7 Void.................................. A.6.8 Pointers to Void...................... A.7 Expressions.................................... A.7.1 Pointer Conversion.................... A.7.2 Primary Expressions................... A.7.3 Postfix Expressions................... A.7.4 Unary Operators....................... A.7.5 Casts................................. A.7.6 Multiplicative Operators.............. A.7.7 Additive Operators.................... A.7.8 Shift Operators....................... A.7.9 Relational Operators.................. A.7.10 Equality Operators................... A.7.11 Bitwise AND Operator................. A.7.12 Bitwise Exclusive OR Operator........ A.7.13 Bitwise Inclusive OR Operator........ A.7.14 Logical AND Operator................. A.7.15 Logical OR Operator.................. A.7.16 Conditional Operator................. A.7.17 Assignment Expressions............... A.7.18 Comma Operator.......................... A.7.19 Constant Expressions.................... A.8 Declarations..................................... A.8.1 Storage Class Specifiers................. A.8.2 Type Specifiers.......................... A.8.3 Structure and Union Declarations......... A.8.4 Enumerations............................. A.8.5 Declarators.............................. A.8.6 Meaning of Declarators................... A.8.7 Initialization........................... A.8.8 Type names............................... A.8.9 Typedef.................................. A.8.10 Type Equivalence........................ A.9 Statements....................................... A.9.1 Labeled Statements....................... A.9.2 Expression Statement..................... A.9.3 Compound Statement....................... A.9.4 Selection Statements..................... A.9.5 Iteration Statements..................... A.9.6 Jump statements.......................... A.10 External Declarations........................... A.10.1 Function Definitions.................... A.10.2 External Declarations................... A.11 Scope and Linkage............................... A.11.1 Lexical Scope........................... A.11.2 Linkage................................. A.12 Preprocessing................................... A.12.1 Trigraph Sequences...................... A.12.2 Line Splicing........................... A.12.3 Macro Definition and Expansion.......... A.12.4 File Inclusion.......................... A.12.5 Conditional Compilation................. A.12.6 Line Control............................ A.12.7 Error Generation........................ A.12.8 Pragmas................................. A.12.9 Null directive.......................... A.12.10 Predefined names....................... A.13 Grammar......................................... Appendix B - Standard Library.................................... B.1.1 File Operations................................ B.1.2 Formatted Output......................... B.1.3 Formatted Input.......................... B.1.4 Character Input and Output Functions..... B.1.5 Direct Input and Output Functions........ B.1.6 File Positioning Functions............... B.1.7 Error Functions.......................... B.2 Character Class Tests: ................. B.3 String Functions: ..................... B.4 Mathematical Functions: ................. B.5 Utility Functions: ....................

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧