c语言 循环buf数据修改,C语言实现对文件内容进行修改

项目中需要实现对文件内容进行修改,所以有了以下的测试程序,其中遇到了很多问题,在这一一记录下来。

其实实现原理很简单,首先是要实现定位到所需要的字段的那一行,之后再对指定字段进行修改。在我接触了shell编程后,觉得shell编程会很容易实现(网上说可以用sed命令,还没接触过,有时间再弄弄)。但是由于C语言是面向过程的语言,需要顺序执行的特点,所以,实现中遇到了很多麻烦。

首先,需要修改的文件—data文件的内容如下:

00:00:00:00:00:00-192.168.1.1

00:00:00:00:00:01-192.168.1.2

00:00:00:00:00:02-192.168.1.3

00:00:00:00:00:03-192.168.1.4

ps:1.每行的内容为一组数据,-前面的内容为mac地址, -后面的内容为对应的ip地址。

2.此处每行结束的时候不留多余空格(至于为什么这么处理,下面再做说明)

我想实现的功能是:对我指定的mac地址对应的ip地址进行修改。

比如,我想将00:00:00:00:00:01对应的ip地址修改成192.168.1.5

其实现代码如下:

#include #include #include typedef struct localaddr

{

char mac[18];

char ip[16];

}LOCALADDR;

int main()

{

FILE *fp;

char line_buf[512], buf1[512], buf2[512];

int line_len, len;

LOCALADDR localaddr;

strcpy(localaddr.mac, "00:00:00:00:00:01");

strcpy(localaddr.ip, "192.168.1.5");

if((fp = fopen("data", "r+")) == NULL)

{

perror("fopen");

exit(1);

}

while(fgets(line_buf, 512, fp))

{

line_len = strlen(line_buf);

len += line_len;

sscanf(line_buf, "%[^-]-%[0-9,.]", buf1, buf2); //将-之前的内容(mac地址)赋值给buf1,之后的内容(ip地址)给buf2

if(!strcmp(localaddr.mac, buf1))

{

len -= (strlen(line_buf) + 1); //计算出那一行的行首位置

printf("len = %d\n", len);

if(fseek(fp, len, SEEK_SET) < 0) //定位

{

perror("fseek");

exit(1);

}

strcpy(buf2, localaddr.ip);

strcat(buf1, "-");

strcat(buf1, buf2);

fprintf(fp, "%s", buf1);

fclose(fp);

return ;

}

}

exit(0);

}

编译执行后,data文件的内容变成:

00:00:00:00:00:00-192.168.1.1

00:00:00:00:00:01-192.168.1.5

00:00:00:00:00:02-192.168.1.3

00:00:00:00:00:03-192.168.1.4

测试成功。

Now,come the question:

如果ip地址要求修改成192.168.1.123时,程序编译执行后,data文件内容却变成了:

00:00:00:00:00:00-192.168.1.1

00:00:00:00:00:01-192.168.1.1230:00:00:00:00:02-192.168.1.3

00:00:00:00:00:03-192.168.1.4这是怎么了?

分析:

ip的主机地址字段由原来的“2”变成“5”的时候,长度没有发生变化,所以直接覆盖了原来的“2”,其他无变化。

但是,当“2”变成“123”的时候,长度不一致,需要多占用2个字节,所以除了“123”中的“1”覆盖了原来的“2”之外,“123”中的“2”占用了换行符的空间,导致第三行的内容跑上了第二行,而“123”中的“3”把原来第三行的第一个“0”的空间占据了,所以出现了以上这种意外。

解决方法:

我的解决方法也很简单,就是确保data文件内每行的长度都>=34     即:17(mac地址长度)+15(ip地址最大长度)+1(一个“-”)+1(换行符)

虽然不是通过修改代码来解决问题的,但这也是解决方法的一种,不是吗?

手写C语言循环队列:嵌入式场景下的内存可控FIFO实现 队列(Queue)是一种基础的先进先出(FIFO)数据结构,其核心原理是通过首尾指针或计数器管理线性存储空间的读写边界。在C语言中,由于缺乏标准容器抽象,实现一个真正可靠、可审计的队列需直面内存布局、类型安全与并发控制等底层问题。技术价值体现在确定性执行、零动态分配、缓存友好及易于静态分析——这使其成为嵌入式系统、RTOS中间件和驱动开发中的关键基础设施。典型应用场景包括UART中断缓冲、任务间轻量IPC、传感器数据流水线及日志生产者-消费者模型。本文聚焦于循环数组实现,深入解析enqueue/dequeu 阅读详情

相关推荐

C语言循环队列实现:从FIFO原理到嵌入式生产级应用

队列是计算机科学中最基础的线性数据结构之一,其FIFO(先进先出)特性广泛应用于操作系统调度、网络协议栈、DMA缓冲和实时任务管理等场景。在C语言中,由于缺乏标准容器库支持,开发者需深入理解内存布局、指针运算与边界控制,才能正确实现enqueue和dequeue操作。循环数组方案凭借零动态分配、缓存友好及确定性执行等优势,成为嵌入式与系统编程的事实标准。本文围绕C语言手写队列展开,涵盖模运算优化、空满判定策略、内存屏障应用及多核安全设计,适用于裸机开发、FreeRTOS集成与高性能消息传递等真实工程场景。

cnracht8153的博客 431

基于C语言实现一个循环缓冲区

由于嵌入式系统的资源受限性,在大多数项目中都可以找到循环缓冲区数据结构。循环缓冲区(也称为环形缓冲区)是固定大小的缓冲区,就好像内存在本质上是连续的和循环的一样。随着内存的生成和消耗,数据不需要重新洗牌——而是调整头/尾指针。添加数据时,头指针前进。当数据被消费时,尾指针前进。如果到达缓冲区的末尾,指针将简单地环绕到开头。循环缓冲区通常用作固定大小的队列。固定大小有利于嵌入式系统,因为开发人员经常尝试使用静态数据存储方法而不是动态分配。

1921

Linux实验二:编程实现程序list.c,列表普通磁盘文件,包括文件名和文件大小

Linux实验二:编程实现程序list.c,列表普通磁盘文件,包括文件名和文件大小。1 实验目的:2 实验要求:3 实验设计4 实验测试:(1)./list -r 递归方式列出子目录(每项要含路径,类似find的-print输出风格,需要设计递归程序)。(2)./list -a列出文件名第一个字符为圆点的普通文件(默认情况下不列出文件名首字符为圆点的文件)(3)./list -l 4096后跟一整数,限定文件大小的最小值(字节)(4)./list -h 4096后跟一整数,限定文件大小的最小值(字节)(

weixin_43297914的博客 2144

c语言在一次运行中多次处理一个文件

1.若只用一个文件位置指针,那么需要每次使用前调用函数rewind 或fseek 函数名: rewind() 功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头 注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。 rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);[1] 用 法: void rewind(FILE *str.

wanxiangzx的博客 1250

C语言 | 深入学习数组

说明:本文章之讨论一维数组,适宜程度:对C语言初步认识及想深入学习者 1、从编译器角度理解数组 从编译器角度理解来讲,数组也是一个变量,和普通的变量没有本质的区别。变量的本质指的是一段内存空间,编译器在编译的时候,会将一个变量名和这段内存空间的第一个字节地址绑定,变量的类型决定了这段内存空间的字节数。当我们希望访问的这段内存空间的时候,一个方法就是利用变量名访问,但是变量名会受到作用域的限制,还有另外一种发法就是直接使用地址访问,并且不会受到作用域的限制。数组的定义一样遵循这样的原理。 2、从内存角度理解数

jackJruit的博客 1221

buf 经典使用

初始化发送和接收数据缓冲区。数据缓冲区使用环形缓冲区结构,通过头尾指针的循环移动,实现对缓冲区的动态管理。其定义如下: typedef struct    {        spi_buf buf[MAX_SPI_BUF];        unsigned int head, t

kerson的专栏 4652

C语言提高

//头文件函数声明 //防止头文件重复包含(相互包含陷入包含死循环) #pragma once //兼容C++编译器 //如果是C++编译器,按c标准编译 #ifdefine __cplusplus //C语言编译器中已有的宏,不是自定义宏 extern "C" { #endif //接口函数 #ifdefine __cplusplus extern "C" } #endif /...

u011591807的博客 911

Linux c语言实现修改文本字符串

要在Linux c 程序里面实现文本的字符串读写,百度一下,都是比较简单的字符串处理,并没有类似的说明,后来换成bing 找到一些蛛丝马迹 http://bbs.csdn.net/topics/390016741 这个CSDN的 topic 不错 虽然没有直接达到我的要求,至少我能找到重要的线索了 用seek 去定位 FILE *fp; char line[256],*pStr; c

lqxandroid2012的专栏 2350

操作系统—文件管理,C语言实现(1、编程显示文件自身。 2、编程实现文件加密解密。 3、编程实现文件的合并。)

附上个人文章地址 推荐点此此阅读效果更佳 1.编写C语言代码显示文件本身 在此实验中,先在自己的电脑中建立一个txt文本文件,并输入数据。同时需要知道该文件的保存路径(需要写在代码里) 直接上代码: #include <stdio.h> #include <stdlib.h> void main() { FILE *fp; int a[80]; if((fp=fopen(...

weder的博客 2434

用C代码实现环形缓冲区(ring buf

因嵌入式项目需要,串口接收的数据有很高的周期性发送频率,原方式通过查询接收标志再接收会导致数据丢失和硬件buf溢出等问题,因此考虑开足够大的环形缓冲区(ring buf实现,接收中断中仅实时的进行buf写操作,应用程序进行循环查询处理,将数据处理和数据接收解耦合,本文采用VS Code + Gcc编译器编写了测试验证程序,对ringbuf进行了测试,参考文章链接,并非照抄,而是在原文基础上进行了改进,并封装成单独的.c文件。单个C程序可正常编译,但多个C程序编译报错(未定义的函数名)

啸风 1459

在C和C ++中创建循环缓冲区

由于嵌入式系统的资源限制,在大多数项目中都可以找到循环缓冲区数据结构。 循环缓冲区(也称为环形缓冲区)是固定大小的缓冲区,其工作方式就像内存是连续的且本质上是循环的。随着内存的生成和消耗,不需要重新整理数据–而是调整了头/尾指针。添加数据后,头指针前进。当数据被消耗时,尾指针前进。如果到达缓冲区的末尾,指针将简单地绕到起始位置。 有关循环缓冲区操作的更详细的摘要,请参阅Wikipedia文章。本文的其余部分假定您已了解循环缓冲区的工作方式。 目录: 为什么要使用循环缓冲区? C实施 使用封装

qq_36075612的博客 5252

(假的)数据结构与(真的)C语言——通过文件读取迷宫行列数求解路径

此代码是关于我们这学期专业课的实验作业,本来按理说我不想写任意的,但是当时以为这个挺简单就跟老师说要写任意行列的,然后作大死的写了一周,爆肝了两天 注:本次代码关于栈的借助了网上某大佬的成果,但是我现在也找不到那位大佬的博客了因此无法注明,如果大佬看到这篇文章希望不要误会!!请联系我我马上给你加上引用来源~ 首先讲一下,实验题目: 已知一个6×8的迷宫,利用堆栈求出并显示一条通路;若通路不存在,则显示无通路;迷宫矩阵的数据保存在一个文本文件中,相邻数据用空白符分隔。程序执行时,迷宫数据文件标识符从键盘输入。

weixin_43458672的博客 1740

linux c语言定位显示字符,Linux c语言实现修改文本字符串

要在Linux c 程序里面实现文本的字符串读写,百度一下,都是比较简单的字符串处理,并没有类似的说明,后来换成bing 找到一些蛛丝马迹http://bbs.csdn.net/topics/390016741这个CSDN的 topic 不错虽然没有直接达到我的要求,至少我能找到重要的线索了用seek去定位FILE*fp;charline[256],*pStr;constcharstr1...

weixin_32243309的博客 300

C语言文件读写操作技术分析

C语言中的文件读写操作通过文件描述符和一系列标准I/O函数实现,提供了灵活而强大的文件处理能力。在实际编程中,应根据具体需求选择合适的文件模式和函数,并注意错误处理和缓冲区的管理。通过掌握C语言中的文件读写技术,可以更好地实现数据的持久化和文件的处理。818文库 cnkvip.com 创作分享。

u012397040的博客 790

linux一个一个修改字符串,Linux c语言实现修改文本字符串

要在Linux c 程序里面实现文本的字符串读写,百度一下,都是比较简单的字符串处理,并没有类似的说明,后来换成bing 找到一些蛛丝马迹http://bbs.csdn.net/topics/390016741这个CSDN的 topic 不错虽然没有直接达到我的要求,至少我能找到重要的线索了用seek去定位FILE*fp;charline[256],*pStr;constcharstr1...

weixin_39625586的博客 237

一篇入门C语言文件

本科期间C语言的课本无论哪个版本都会有【文件】这一章节,不过好多学校基本上不讲或者就出一道选择题,讲得很浅,今天这篇详细总结一下这部分的知识~

软工科班,擅长Matlab、C++、微信小程序开发 814

C语言的函数与文件操作

c语言中使用函数对语句进行分组 所有的c语言程序都是由一个或多个的的函数构成的 所有c语言程序中必须有一个叫做main的函数,这个函数叫做主函数 函数之间通过互相调用建立联系,在函数调用过程中主动发起的一方叫调用函数,被动接受的一方叫被调用函数 返回值是一个特殊的变量,函数中使用return语句对返回值变量赋值 调用函数中可以把函数调用语句当数字使用,这个数字就来自于函数的返回值变量,返回

Robot Man的技术博客 780

逆向基础之C语言 第一篇

逆向之C语言00_C语言概述知识点1 【编译的过程】Visual C++ 6.0安装VC6.0配置兼容性创建c工程添加源文件知识点2 【完整的C代码分析】 00_C语言概述 知识点1 【编译的过程】 编辑器:程序员写代码的过程(记事本、VC6.0、vim…)(让程序员看懂) 编译器:查看代码的语法错误,生成汇编语言。 汇编器:将生成好的汇编语言生成二进制语言(也叫做目标文件) 连接器:将生成好的二进制语言+用到的库+启动代码=====>可执行文件 Windows开发特点: 在电脑上装一个VC或者其

_Co1a 1832
上一篇: c语言中d1的分辨率是,C中的方法分辨率顺序
下一篇: android商品上架功能实现,Android仿京东、天猫app的商品详情页的布局架构, 以及功能实现...
爱奔跑的橙儿
博客等级 码龄8年 23粉丝 89原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值