C語言實現對檔案內容進行修改

來源:互聯網
上載者:User

項目中需要實現對檔案內容進行修改,所以有了以下的測試程式,其中遇到了很多問題,在這一一記錄下來。

其實實現原理很簡單,首先是要實現定位到所需要的欄位的那一行,之後再對指定欄位進行修改。在我接觸了shell編程後,覺得shell編程會很容易實現(網上說可以用sed命令,還沒接觸過,有時間再弄弄)。但是由於C語言是面向過程的語言,需要順序執行的特點,所以,實現中遇到了很多麻煩。


首先,需要修改的檔案—data檔案的內容如下:

00:00:00:00:00:00-192.168.1.100:00:00:00:00:01-192.168.1.200:00:00:00:00:02-192.168.1.300: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 <stdio.h>#include <stdlib.h>#include <string.h>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地址)給buf2if(!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.100:00:00:00:00:01-192.168.1.500:00:00:00:00:02-192.168.1.300: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.100:00:00:00:00:01-192.168.1.1230:00:00:00:00:02-192.168.1.300: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(分行符號)

雖然不是通過修改代碼來解決問題的,但這也是解決方案的一種,不是嗎。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.