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(换行符)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Linux系统下的inotify机制来实现文件实时监测和更新。 inotify是Linux内核提供的一种文件事件监控机制,可以监控文件系统中特定目录下的文件或目录,当这些文件或目录发生变化时,inotify会发送相应的事件通知给用户空间程序,从而实现文件实时监测和更新。 以下是一个简单的C语言示例程序,演示如何使用inotify机制来实现文件实时更新: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/inotify.h> #define EVENT_SIZE (sizeof(struct inotify_event)) #define BUF_LEN (1024 * (EVENT_SIZE + 16)) int main(int argc, char **argv) { int fd, wd; char buf[BUF_LEN]; int len, i; struct inotify_event *event; if (argc < 2) { fprintf(stderr, "Usage: %s <file>\n", argv[0]); exit(EXIT_FAILURE); } fd = inotify_init(); if (fd < 0) { perror("inotify_init"); exit(EXIT_FAILURE); } wd = inotify_add_watch(fd, argv[1], IN_MODIFY); if (wd < 0) { perror("inotify_add_watch"); exit(EXIT_FAILURE); } printf("Watching file %s for changes...\n", argv[1]); while (1) { len = read(fd, buf, BUF_LEN); if (len < 0) { perror("read"); exit(EXIT_FAILURE); } i = 0; while (i < len) { event = (struct inotify_event *)&buf[i]; if (event->mask & IN_MODIFY) { printf("File %s was modified\n", argv[1]); } i += EVENT_SIZE + event->len; } } exit(EXIT_SUCCESS); } ``` 该程序首先调用inotify_init()函数创建一个inotify实例,然后调用inotify_add_watch()函数来监控指定的文件(本例中为第一个命令行参数),并设置监控事件为IN_MODIFY,表示只监控文件内容修改事件。接着程序进入一个无限循环,调用read()函数阻塞等待inotify事件通知,当读取到事件时,通过遍历事件缓冲区来获取每个事件的详细信息,并根据事件类型来执行相应的操作(本例中只输出一条简单的提示信息)。 编译该程序并运行,可以在另一个终端中修改指定的文件内容,程序会实时输出提示信息,表明文件已经被修改了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值