c-将含有指针的结构体写入文件,关闭程序后如何再次读写

问题描述

将含有指针的结构体写入文件,关闭程序后如何再次读写

从文件中读出一篇英文文章,若干行,每行最多不超过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都执行了!!

时间: 2024-07-28 22:47:35

c-将含有指针的结构体写入文件,关闭程序后如何再次读写的相关文章

让你提前认识软件开发(13):指针及结构体的使用

第1部分 重新认识C语言 指针及结构体的使用   [文章摘要]         指针在C语言中占有很重要的地位,同时也是学习C语言的难点所在.结构体属于用户自己建立的数据类型,在实际的软件开发项目中应用很广泛.         本文以实际的例子介绍了C语言中指针和结构体的使用方法,为进一步的学习和应用提供了有益的参考. [关键词]         C语言 指针  结构体 文件   1.指针和结构体简介         在C语言中,将地址形象化地称为指针,意即通过它能够找到以它为地址的内存单元.实

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面也讲了许多,也提到了多级指针的概念,那具体我们怎么去操作呢 #include <stdio.h> #include <stdlib.h> main(){ int i = 3; //一级 int* p = &i; //二级,保存一级指针 int** w = &p; //三

C语言 socket 如何发送带指针的结构体?

问题描述 C语言 socket 如何发送带指针的结构体? 发送一个带指针的结构体,我知道怎么发送? 先把结构体转换成字符串,然后发出.但是接收的时候,怎么接收到结构体中?thanks! 解决方案 发送: struct f;char *ffff[sizeof(f)];memcpy(ffff &f sizeof(f)); 接收: struct f; ffff为收到的数据 memcpy(&f ffff sizeof(ffff)); 解决方案二: C语言---结构体指针C语言--结构体中的指针C语

Go语言指针访问结构体的方法_Golang

本文实例讲述了Go语言指针访问结构体的方法.分享给大家供大家参考.具体分析如下: Go有指针,但是没有指针运算. 结构体字段可以通过结构体指针来访问.通过指针间接的访问是透明的. 复制代码 代码如下: package main import "fmt" type Vertex struct {     X int     Y int } func main() {     p := Vertex{1, 2}     q := &p     q.X = 1e9     fmt.P

struct-关于结构体指针与结构体数组

问题描述 关于结构体指针与结构体数组 目前开发遇到一个问题,有一个动态库dll,需要传进去一个结构体数组,函数为 opt_api_init(InfoInitMarket* InitMarketInfo): 这个是结构体 typedef struct tagInfoInitMarket { char commID[COMMODITY_ID + 1]; //合约编码 char classID[CLASS_ID + 1]; //品种代码 char instrumentType; //合约类型:期货:F

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗

问题描述 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以直接通过这个指针读取它的成员变量吗? 解决方案 当然是可以的.但是更好的方式是把分配内存的工作交给调用者去做.因为这样不容易忘记释放内存.申请和释放的代码成对出现. 参考windows api里的GetWindowRect,它由调用者传入一个lpRect结构体指针,函数获取了窗口坐标,填充它. 解决方案二: 只要是在同一个

初学者问一个关于c中二级指针与结构体的问题

问题描述 初学者问一个关于c中二级指针与结构体的问题 #include #include typedef struct node{ int num; char ch; }NODE; int main(void){ int n,i; NODE F; printf("input n:"); scanf("%d",&n); F=(NODE)malloc(n*sizeof(NODE*)); printf("input num and ch:");

函数指针和数组指针的区别,函数指针在结构体中怎么实现排序?

问题描述 函数指针和数组指针的区别,函数指针在结构体中怎么实现排序? 求咨询下,结构体浮点数组的排序,多重条件用函数指针传参数给库函数怎么实现排序呢? 解决方案 参考:http://blog.csdn.net/lethic/article/details/7781203 解决方案二: 函数指针及结构体 解决方案三: 函数指针:指向函数入口的指针,为指向代码段的一个地址. 数组指针:指向数组的指针.

深入理解C指针之六:指针和结构体

原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结构体,可能要分别为每个字段声明一个数组,使用结构体,可以声明一个结构体的数组来组合这些字段. 结构体基础 声明结构体的方式有很多种,这里先讨论两种: //第一种声明方式 struct person{ char* firstname; char* secondname; char* title; un