紧急求助:文件读写相关,在线等

xhz1234 2014-01-15 05:00:29
代码的目的是判断/tmp目录下有没有host_info_p_phy文件,如果有,则将文件中的数字读取保存到一个整型变量中;如果不存在该文件,则创建它,并将123写入该文件,之后再读取该文件,并将文件中的数组读取保存到一个整型变量中。
测试发现,写入文件正常,读取文件不正确。请各高手帮忙看看,很着急,在线等待........

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

int main()
{
FILE *fp = NULL;
char cmd[256] = "\0";
int ret = 0;
int tmp = 0;
if((fp=fopen("/tmp/host_info_p_phy","r"))==NULL)
{
printf("File /tmp/host_info_p_phy not exist!\n");
printf("let's make it!\n");
snprintf(cmd,256,"touch /tmp/host_info_p_phy");
system(cmd);
if((fp=fopen("/tmp/host_info_p_phy","w"))==NULL)
{
printf("Error,no file!\n");
return -1;
}
fprintf(fp,"%d",tmp);
fflush(fp);
}
printf("Position:%d\n", ftell(fp));
rewind(fp);
printf("Position:%d\n", ftell(fp));
fread(&ret,sizeof(int),1,fp);
printf("ret is : %d\n", ret);
fscanf(fp,"%d", &ret);
printf("ret is : %d\n", ret);
fclose(fp);
return 0;
}
...全文
247 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2014-01-16
  • 打赏
  • 举报
回复
#include <stdlib.h> #include <stdio.h> #include <string.h> int main() { FILE *fp = NULL; char cmd[256] = "\0"; int ret = 0; int tmp = 0; if((fp=fopen("/tmp/host_info_p_phy","r"))==NULL) { printf("File /tmp/host_info_p_phy not exist!\n"); printf("let's make it!\n"); snprintf(cmd,256,"touch /tmp/host_info_p_phy"); system(cmd); if((fp=fopen("/tmp/host_info_p_phy","w"))==NULL) { printf("Error,no file!\n"); return -1; } fprintf(fp,"%d",tmp); fflush(fp); // 这里应该关闭fp } // 这里应该以读的方式打开文件 printf("Position:%d\n", ftell(fp)); rewind(fp); printf("Position:%d\n", ftell(fp)); fread(&ret,sizeof(int),1,fp); printf("ret is : %d\n", ret); fscanf(fp,"%d", &ret); printf("ret is : %d\n", ret); fclose(fp); return 0; }
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for “update”). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired. 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
hellocondition 2014-01-16
  • 打赏
  • 举报
回复
引用 6 楼 xhz1234 的回复:
已解决,是4楼说的是一个原因。。。主要原因是: 开始/tmp目录下没有host_info_p_phy文件。进入第一个if的语句块中,执行 if((fp=fopen("/tmp/host_info_p_phy","w"))==NULL) ,将123写入文件。之后,从该文件中进行读取数据,此时文件指针fp的性质是“w”,而不是“r”。因此,程序执行第一次时,文件写入成功,但读取错误。
没有注意到楼主的打开文件方式,读写操作应该使用w+模式就可以了。
xhz1234 2014-01-15
  • 打赏
  • 举报
回复
已解决,是4楼说的是一个原因。。。主要原因是: 开始/tmp目录下没有host_info_p_phy文件。进入第一个if的语句块中,执行 if((fp=fopen("/tmp/host_info_p_phy","w"))==NULL) ,将123写入文件。之后,从该文件中进行读取数据,此时文件指针fp的性质是“w”,而不是“r”。因此,程序执行第一次时,文件写入成功,但读取错误。
max_min_ 2014-01-15
  • 打赏
  • 举报
回复
引用 3 楼 xhz1234 的回复:
文件写入正确,从文件中读取不正确
检查下读写函数的返回值!确认下读写数据的时候操作是否正确!
hellocondition 2014-01-15
  • 打赏
  • 举报
回复
不知道lz是哪次读取不对,lz只往文件里写了一个值,而读取了两次,第二次读的时候文件的指针已经指向文件结束了吧。
xhz1234 2014-01-15
  • 打赏
  • 举报
回复
文件写入正确,从文件中读取不正确
zhuobattle 2014-01-15
  • 打赏
  • 举报
回复
不好意思,没看到你的rewind,那么现在具体出了什么问题?
zhuobattle 2014-01-15
  • 打赏
  • 举报
回复
你写完如果马上用同一个fp的话,应该要fseek一下回到文件头
源码下载地址: https://pan.quark.cn/s/8d2c461c797c JavaWeb程序设计构成了掌握Web交互式应用程序开发的核心领域,对于初学者来说,精通这一技术具有决定性意义。在“JavaWeb程序设计(第三版)作业答案”中,我们可以预期获得针对该教材习题的一系列深入解析,从而协助学习者强化知识体系。 JavaWeb所包含的技术组件涵盖了Servlet、JSP(JavaServer Pages)、JDBC(Java Database Connectivity)以及各类框架如Spring MVC、Struts等。Servlet是Java平台提供的一种扩展服务器功能的接口,能够处理HTTP请求并生成相应的反馈。JSP则是一种用于构建动态网页的工具,它支持开发者将HTML代码与Java代码进行整合编写,从而简化了Web应用程序的开发流程。 作业答案通常会涉及以下几个核心内容: 1. **Servlet基础**:可能包含Servlet生命周期、init(), service(), destroy()方法的应用,以及如何在web.xml文件中设定Servlet的映射关系。 2. **JSP基础**:JSP的九大内置对象,如request、response、session、application等的使用,以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的实际操作。 3. **HTTP协议理解**:GET和POST请求方法的差异,请求头与响应头的应用,以及会话管理的概念阐释。 4. **JDBC数据库操作**:与数据库建立连接,执行SQL指令,处理查询结果集,以及...
源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需求。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需求安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...

70,038

社区成员

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

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