问题描述
- 将含有指针的结构体写入文件,关闭程序后如何再次读写
-
从文件中读出一篇英文文章,若干行,每行最多不超过80个字符。首次运行都不会出现错误,关闭后再次读写文件就会出现错误
#include
#include
#include
#include
#include
#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:ca.txt","r"))==NULL)
{
printf("没有该文件n");
return;
}
else
{
fp=fopen("D:ca.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
{
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:ca.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:ca.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("写入请按1n");
printf("读出请按2n");
printf("退出请按0n");
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);
}
}
解决方案
仔细调试你的程序,贴出错误信息、发生错误的具体代码行,你的测试用例和输入输出。
解决方案二:
if((fp=fopen("D:ca.txt","r"))==NULL)
{
printf("没有该文件n");
return;
}
else
{
fp=fopen("D:ca.txt","r");
这两个fopen都执行了!!