查詢了幾篇文章發現似乎無法這樣作
其中有個最主要的因素是因為:
文字檔是循序存放的,如果確定新資料與舊資料文字長度是一樣的,才可以直接作開檔、讀檔、再改寫。
舉個例子:
現在有一個設定檔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