C语言,文件定位问题详解

2023-11-12

最近在完成上机题碰到文件操作,要求能够修改某一行的数据,关于这个问题,我们自然就会想到用fseek来定位然后修改这一行的内容,可是问题就来了,具体啥问题请往下看。

比如说text.txt的内容为
这里写图片描述
这时我想把第二内容改为24
很明显用fseek定位到第二行然后直接改就行了,代码如下:

#include<iostream>
#include<string.h>
#include<string>
#include<fstream>
using namespace std;
#define N 1000
int len;
char buf[N];
char buf1[N];
int main()
{
    FILE* fp; int i, i1;

    i = 2;
    i1 = i;
    errno_t err;
    if ((err = fopen_s(&fp,"text.txt", "r+")) != NULL) { cout << "The file can not be opened.\n"; exit(0); }
for (; i1 >= 1; i1--)
        fgets(buf1, N, fp);
    fseek(fp, 0L, SEEK_CUR);
    strcpy_s(buf1,"24");
    rewind(fp);
    for (; i>1; --i)
        fgets(buf, N, fp);
    fseek(fp, 0, SEEK_CUR);
    fputs(buf1,fp);
    return 0;
}

这段代码没啥好解释的,就是简单的定位到第二行,然后修改,可是结果却很神奇,
这里写图片描述
那么问题来了,为什么会出现这种情况,3不是应该在第三行吗为什么跑上面了,当时我是一脸懵逼,不过既然出现问题了,我们就好好分析,不能轻言放弃,这是作为程序猿的基本素养对不对。

小小的尝试:加换行符

ok很明显问题是少了一个换行符,那么我们在最后一个字符后面加个换行符看行不行,即将上面的代码改一下:

strcpy_s(buf1,"24\n");

然而更神奇的现象出现了,
这里写图片描述
怎么回事,为什么下面的3不见了?
好了,到这里,你肯定怀疑人生了,当然解决办法不是没有,有种思路是把第二后面数据全部保存起来,改完第二行,再覆盖进去,在这里我就不演示了。下面我们来仔细分析一下为什么会出现这个现象。

问题本源:

其实结合上面的例子我们应该已经看出点猫腻了,其实有一点很重要:一旦文件被你输进去,其字符串所占的大小就固定了。

这是我经过大量的例子发现的,这点很重要,知道了这个,上面的现象就可以解释了。
在第一个例子中,我们的文件里面是:
1
2
3
4
我把这些转换成字符形式方便看:‘1’,‘\n’ ,’2’, ‘\n’, ‘3’, ‘\n’ ,’4’
ok那么当我们吧第二行改成’2’ ‘4’时,’4’自然把’2’后面的换行符给占掉了,所以’3’跑上面去了,第二例子用同样的思路也能分析出来,我就不做赘述了。

解决方案:

既然知道了问题的本源,那么解决方法就很明了了,既然我们一旦输入大小就固定了,那么我们在输入的时候在每一行输完的时候不要先急着换行多输入几个空格,保证修改的数据不会超过加上空格后的长度,即:
这里写图片描述
就像这样,那么我试验一下
这里写图片描述
第一次一点没改的代码就成功了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言,文件定位问题详解 的相关文章

随机推荐

  • Haxe: class, object, new and constructor

    haxe 类 对象 new 和 构造函数 package if neko import neko Lib import neko io File end class Thing public function new trace new f
  • Mysql 解析

    目录 1 索引 为什么需要索引 索引的类型有哪些 mysql使用的是哪种索引数据结构
  • 自定义flume拦截器-实现了多种功能

    1 自定义拦截器实现说明 1 实现interceptor接口 并实现其方法 接口完全限定名为 org apache flume interceptor Interceptor 2 自定义拦截器内部添加静态内部类 实现Builder接口 并实
  • 使用Jfreechart实现带热点的饼状图

    JFreeChart是JAVA平台上的一个开放的图表绘制类库 它完全使用JAVA语言编写 是为applications applets servlets 以及JSP等使用所设计 JFreeChart可生成饼图 pie charts 柱状图
  • 【优化求解】基于粒子群算法集合生物地理算法CPSOBBO求解MLP问题matlab代码

    1 简介 Biogeography Based Optimizer BBO is employed as a trainer for Multi Layer Perceptron MLP The current source codes a
  • 卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet

    摘要 CIFAR 10竞赛之后 卷积网络之父Yann LeCun接受相关采访 他认为 卷积网络需要大数据和高性能计算机的支持 深层卷积网络的训练时间不是问题 运行时间才是关键 Yann LeCun还分享了他正在做的一些最新研究 Kaggle
  • Centos7.6 源码编译部署percona mysql 5.7.39-42

    Centos7 6 源码编译部署percona mysql 5 7 39 42 参考链接 mysql5 7 35源码编译安装部署 CentOS7 编译安装 Percona Server 5 7 percona Server for MySQ
  • 年薪100万和10万程序员的差距

    点击蓝字关注 回复 职场进阶 获取职场进阶精品资料一份 我们看武侠大片 经常有那种本来可以练就绝世武功的大虾 阴差阳错练的走火入魔 一开始还可以硬撑 还能打败一些虾兵蟹将 遇见真正的高手 这些大虾们立马就败下阵来 其实程序员的职业生涯 如同
  • jquery获取上级、同级和下级元素

    1 JQuery parent expr 找父亲节点 可以传入expr进行过滤 比如 parent parent 或者 parent parent child 2 JQuery parents expr 查找所有祖先元素 不限于父元素 3
  • SQL Server安装教程(2022年更新)

    很多朋友在安装SQL Server的过程中会碰到一些小状况 今天就以Microsoft SQL Server2019为例来聊聊SQL Server安装的相关问题 提示 若之前安装过SQL Server 务必保证在重装前将其卸载干净 目录 1
  • ODrive踩坑(一)windows下使用环境的搭建,odrivetool及USB驱动的安装

    最近有空玩玩无刷电机 早就听说ODrive的控制效果不凡 淘宝400买来玩玩 电机使用我以前囤的几个拆机DJI 3512 别看拆机 但悟的电机是针不戳 编码器使用TLE5012B E1000磁编码器 干回老本行画了张PCB 一方面连接编码器
  • JS异常: Uncaught RangeError: Maximum call stack size exceeded

    今天被一个bug弄得头大 找了无数资料 网上说是递归函数的原因 https blog csdn net qq 30100043 article details 72642205 还是未能解决问题 继续找 最后在 https blog csd
  • 【故障集合】综合架构rsync服务与nfs服务错误集合(持续补充中)

    一 rsync服务 1 1 not a regular file 不是普通文件 scp跟cp类型 默认只能复制普通文件 复制目录 加上 r参数即可 root backup scp etc 172 16 1 31 tmp root 172 1
  • 软件设计七大原则

    在软件开发中 为了提高软件系统的可维护性和可复用性 增加软件的可扩展性和灵活性 程序员要尽量根据 7 条原则来开发程序 从而提高软件开发效率 节约软件开发成本和维护成本 我来依次来总结这 7 条原则 这 7 种设计原则是软件设计模式必须尽量
  • uni-app 框架超详细新手入门

    什么是uni app 介绍 uni app 是一个使用 Vue js 开发跨平台应用的前端框架 开发者通过编写 Vue js 代码 uni app 将其编译到iOS Android 微信小程序等多个平台 保证其正确运行并达到优秀体验 uni
  • 公网远程访问宝塔面板和网页【内网穿透】

    1 ngrok 限制带宽 不限制流量 进入ngrok官网 Sunny Ngrok内网转发内网穿透 国内内网映射服务器 1 注册 2 开通隧道 3 穿透网页 1 配置ngrok 输入网页本地地址和端口号 2 运行ngrok sunny cli
  • IntelliJ IDEA下载安装教程(超详细图解)

    1 IDEA的下载 官网链接 https www jetbrains com idea l 1 点击上面链接进入官网 点击Developer Tools 再点击 Intellij IDEA 2 点击Download 进入IDEA下载界面 3
  • Vue:数据双向绑定和v-系列指令

    Vue js是当下最火的一款前端框架了 学习的时候要多动手实践以帮助理解 我是通过例子来学习的 这样记的快一些 目录 Vue js介绍 如何引入Vue 何为声明式渲染 如何实现 文本插值 message v html v bind 绑定元素
  • 数组的添加和删除过滤方法总结es6 filter()

    es6 filter 数组过滤方法总结 Array every x gt x 是每一个都要满足 Array some x gt x 是有一个满足 Array find findIndex 返回符合条件的第一个值 Array filter 过
  • C语言,文件定位问题详解

    最近在完成上机题碰到文件操作 要求能够修改某一行的数据 关于这个问题 我们自然就会想到用fseek来定位然后修改这一行的内容 可是问题就来了 具体啥问题请往下看 比如说text txt的内容为 这时我想把第二内容改为24 很明显用fseek