鱼C论坛

 找回密码
 立即注册
查看: 2691|回复: 13

关于文件操作的问题

[复制链接]
发表于 2021-7-12 11:00:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近学到文件操作方面的内容

以下代码是对 一个整形变量和整形指针变量的存储与读取,这段代码是先跑上面一段进行数据的存储,然后跑下面那一段进行数据的读取。可是数据读取部分程序报错了
报错提示:test_file.exe 中的 0x78bccac8 (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0x004ffee8 时发生访问冲突

#include<stdio.h>
#include<stdlib.h>

///*
int main()
{
        int *p,**h,i;
        FILE *f;
       
        p=&i;
        i=1;
       
        f = fopen("a","wb");
       
        fwrite(&p,sizeof(int*),1,f);
        fwrite(p,sizeof(int),1,f);
       
       
        fclose(f);
        printf("%d",*p);
        return 0;
}
//*/

/*

int main()
{
        int *p,**h,i;
        FILE *f;
       
       
        f = fopen("a","rb");
       
        fread(&p,sizeof(int*),1,f);
        fread(p,sizeof(int),1,f);
       
       
        fclose(f);
        printf("%d",*p);
        return 0;
}
//*/

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-12 13:11:02 | 显示全部楼层
1.将
f = fopen("a","rb")

中a后面加上文件后缀


例如:
f = fopen("a.txt","rb")

2.把打开的对应文件关了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 13:14:31 | 显示全部楼层
啥意思 你两个main?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-12 14:47:32 | 显示全部楼层
万千只cnm 发表于 2021-7-12 13:14
啥意思 你两个main?

差不多 不过是先执行上面那一段main  然后把上面注释掉 换执行下面那一段main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-12 15:05:27 | 显示全部楼层

貌似还是有这个错误,不过这个错误貌似是用到了一些没有初始化的地址所导致的。我写这段程序是为了模拟把链表存储到文件里的操作,因为一般链表里会有一个指针指向下一个节点,而如果单纯的把头节点a存进文件里,文件里的a节点里面就只有原本指向下一个节点的地址,而那个地址里面具体的值并没有存进文件里,这样就不算把链表存储到文件里面了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 15:28:58 | 显示全部楼层
每一次运行程序,变量的地址都是不一样的
你不能把变量的地址保存到文件,然后再一次运行去读取文件中保存的这个地址,因为这一次那个地址绝大多数情况存放的内容,不是上一次运行时候的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 15:32:46 | 显示全部楼层
梦竹风 发表于 2021-7-12 15:05
貌似还是有这个错误,不过这个错误貌似是用到了一些没有初始化的地址所导致的。我写这段程序是为了模拟把 ...

你不能把内存中的地址写到文件中保存,因为下一次运行程序,这个文件中保存的地址就不能用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-12 15:33:29 | 显示全部楼层
人造人 发表于 2021-7-12 15:28
每一次运行程序,变量的地址都是不一样的
你不能把变量的地址保存到文件,然后再一次运行去读取文件中保存 ...

对,后来我也注意到这个问题,所以才有 这一段代码:fread(p,sizeof(int),1,f);  这一段是按着上次的地址写入数据,不过又发现上一次的地址在这次程序运行中未被初始化,也有可能存储着什么重要的信息,所以改成用malloc创建一个地址了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 19:40:01 | 显示全部楼层
你两个main当然错了啊。相当于运行了两个程序。
变量都释放了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-12 21:16:24 | 显示全部楼层
万千只cnm 发表于 2021-7-12 19:40
你两个main当然错了啊。相当于运行了两个程序。
变量都释放了

变量是释放了 可是我存储到文件里了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 21:46:21 | 显示全部楼层
 fread(&p,sizeof(int*),1,f);
        fread(p,sizeof(int),1,f);

你读取的都是上一个程序的值  啊(变量的地址)
两个程序,这些值和变量之间根本没关系
而且p是 int*  不是int
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-13 08:46:38 | 显示全部楼层

对啊 所以我实在尝试复刻上一个程序的值啊  让p值针同样指向上次程序指针指向的地址,然后在往这个地址写上上次程序这个地址的值啊  所以 fread(p,sizeof(int),1,f); 应该是没错的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-13 09:23:45 | 显示全部楼层
梦竹风 发表于 2021-7-13 08:46
对啊 所以我实在尝试复刻上一个程序的值啊  让p值针同样指向上次程序指针指向的地址,然后在往这个地址写 ...

你p和&p都是地址啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-13 15:18:35 | 显示全部楼层

对啊  fread 里面的第一个参数就是要去地址啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 02:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表