2015年5月25日 星期一

判斷特定字串, 並改寫檔案的範例~

原本想要作到開啟一個設定檔,接著根據特定字串來直接改寫檔案

查詢了幾篇文章發現似乎無法這樣作

其中有個最主要的因素是因為:

文字檔是循序存放的,如果確定新資料與舊資料文字長度是一樣的,才可以直接作開檔、讀檔、再改寫。

舉個例子:
現在有一個設定檔login.info內容如下

username=danny
password=5566
location=taiwan

現在你想要讀出當字串為password時去改寫密碼的動作,假設你要新寫入的密碼為"123456",然後你使用直接開檔、讀檔、再改寫的方法,想必會變成下面的情形

username=danny
password=123456cation=taiwan

因為你新輸入的文字長度比舊的來的大,所以他會覆蓋到原本舊的其他的資料

=======================================================================
因此看來要改寫檔案就得用另一種方法了,這邊介紹的是,讀取原本檔案,然後寫入到另一個檔案去,沒有改寫的地方就照原本資料寫入,改寫的也一併寫入到新的資料。

最後再把原本資料砍掉,然後把新的資料改名成舊的資料名子。

詳細的範例如下所示:

首先是原始設定檔===========
devicename:dannyDevice
protocol:Bloger
resolution:HD
framerate:30



主要的程式碼部分============
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
#include <ctype.h>

#define DEVICE_INFO_PATH "./device.info"
#define TMP_DEVICE_INFO_PATH "./tmp_device.info"

void modify_file_func()
{
        char buffer[128];

/* open login info in device. */
FILE *fptr, *fptr_tmp;
char tmp[64]={0};

        if ((fptr = fopen(DEVICE_INFO_PATH, "r")) == NULL)
        {
                printf("open_file_error");
                exit(1);
        }
else if((fptr_tmp = fopen(TMP_DEVICE_INFO_PATH, "w")) == NULL)
{
                printf("open_tmp_file_error");
                exit(1);
}

while(fgets(buffer, sizeof(buffer), fptr) != NULL)
        {
if(strstr(buffer, "protocol:"))
{
sprintf(tmp,"protocol:%s\n", 123);
fputs(tmp, fptr_tmp);
memset(tmp,'\0',sizeof(tmp));
}
else if(strstr(buffer, "resolution:"))
{
sprintf(tmp,"resolution:%s\n", 456);
fputs(tmp, fptr_tmp);
memset(tmp,'\0',sizeof(tmp));
}
else if(strstr(buffer, "framerate:"))
{
sprintf(tmp,"framerate:%s\n", 789);
fputs(tmp, fptr_tmp);
memset(tmp,'\0',sizeof(tmp));
}
else
fputs(buffer, fptr_tmp);
        }
        fclose(fptr);
fclose(fptr_tmp);
        
        //刪掉原檔案,並改寫新檔案的名子
sprintf(tmp,"rm %s;mv %s %s", DEVICE_INFO_PATH, TMP_DEVICE_INFO_PATH, DEVICE_INFO_PATH);
system(tmp);
}


int main()
{
modify_file_func();
return 0;
}


最後的device.info檔案內容=======
devicename:dannyDevice
protocol:123
resolution:456
framerate:789



沒有留言:

張貼留言