1. 程式人生 > >linux C 修改文字檔案中指定行的內容

linux C 修改文字檔案中指定行的內容

1、可隨意修改內容

/*
 * Author:aniu12<[email protected]>
 * Date: 2014.02.13
  */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
        /*
    *linebuffer:讀取檔案中的一行存入的緩衝
    *buffer1:一行中第一個欄位的存入緩衝
    *buffer2:一行中第二個欄位的存入緩衝
         */
	char linebuffer[512] = {0};
	char buffer1[512] = {0};
	char buffer2[512] = {0};
    char save[100][512];
    memset(save, 0, sizeof(save));

	int line_len = 0;
	int len = 0;
	int res;
    int i=0;
    int j=0;
	int k=0;
                                
	/*
	 * cc.cfg是檔名,r+代表可以讀寫檔案
	  */
	FILE *fp = fopen("test.txt", "r+");
	if(fp == NULL)
	{
		printf("open error");
		return -1;
	}

	/*
	  *   複製檔案內容到快取陣列save[][]中	
	  */
	while(fgets(save[i], 512, fp))
	{
        i++;
    	}

   fseek(fp,0,SEEK_SET);
	while(fgets(linebuffer, 512, fp))
	{
		k++;
		/*
		 *  在檔案中查詢符合條件的那一行內容,並記錄當前行數
		 */
		sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);
		if(!strcmp("wireless.1.current_state", buffer1))
		{
			k--;
            break;
		}
	}
	
        /*
	  *   將要修改的內容寫入快取中
	  */
	strcpy(buffer2, "=311\0");
	strcat(buffer1, buffer2);
    buffer1[strlen(buffer1)]='\n';
	printf("%d\n",strlen(buffer1));
	printf("%s\n",buffer1);
    memset(save[k], 0, 512);
	strncpy(save[k],buffer1,512);

	/*
	  *   清空檔案內容
	  */
    fseek(fp,0,SEEK_SET);
    truncate("./test.txt",0);//clean test.txt

	/*
	  *   將快取中的資料按行寫入檔案中
	  */
    fseek(fp,0,SEEK_SET);
    for(j=0;j<i;j++)
   	 {
        fwrite(save[j],strlen(save[j]),1,fp);
    	  }
    fclose(fp);
	 return 0;

}

2、Shell中sed命令的C語言實現

 /*
 * Author:aniu12<[email protected]>
 * Date: 2013.02.13
  */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
        /*
    *linebuffer:讀取檔案中的一行存入的緩衝
    *buffer1:一行中第一個欄位的存入緩衝
    *buffer2:一行中第二個欄位的存入緩衝
         */
	char linebuffer[512] = {0};
	char buffer1[512] = {0};
	char buffer2[512] = {0};
    char save[100][512];
    memset(save, 0, sizeof(save));

	int line_len = 0;
	int len = 0;
	int res;
    int i=0;
    int j=0;
                                
	/*
	* cc.cfg是檔名,r+代表可以讀寫檔案
	*/
	FILE *fp = fopen("test.txt", "r+");
	if(fp == NULL)
	{
		printf("open error");
		return -1;
	}
	while(fgets(linebuffer, 512, fp))
	{
		line_len = strlen(linebuffer);
		len += line_len;
		/*
		 * buffer1=wireless.1.current_state
		 * buffer2=1
		 */
		sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);
		if(!strcmp("wireless.1.current_state", buffer1))
		{
			/*
			 * 由於已經找到所需要寫的位置,所以需要寫位置的“頭”
			 */
			len -= strlen(linebuffer);
			/*
			 * 實現檔案位置的偏移,為寫檔案做準備
			 */
			res = fseek(fp, len, SEEK_SET);
			if(res < 0)
			{
				perror("fseek");
				return -1;
			}
            //memset(buffer2,0,sizeof(buffer2));
			strcpy(buffer2, "=311");
			/*strcat(buffer1, "=");*/
			strcat(buffer1, buffer2);
			printf("%d\n",strlen(buffer1));
			/*
			  * 寫檔案,存入所需的內容
			  */
			fprintf(fp, "%s", buffer1);        
			fclose(fp);
			return;
		}
	}
	return 0;
}

3、C 語言讀寫配置檔案

/*
 * File: read and write ConfigFile
 * Author:aniu12<[email protected]>
 * Date: 2014.02.13
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#define FILE_NAME   "./sound.ini"
#define READ_MODE   "r+"
#define BUFFER_SIZE 38
#define BUFFER_NUM  2
#define SPK_KW      "spk"
#define MIC_KW      "mic"

int Write_Line_Data ( char *path, int data, unsigned char *keyword )
{

        /*
    *linebuffer:讀取檔案中的一行存入的緩衝
    *buffer1:一行中第一個欄位的存入緩衝
    *buffer2:一行中第二個欄位的存入緩衝
         */
	char linebuffer[BUFFER_SIZE] = {0};
	char buffer1[BUFFER_SIZE] = {0};
	char buffer2[BUFFER_SIZE] = {0};
    char save[BUFFER_NUM][BUFFER_SIZE];
    int i=0;
    int j=0;
	int k=0;
                                
    memset ( save, 0, sizeof(save) );
	
    /*
	 * FILE_NAME是檔名,r+代表可以讀寫檔案
	  */
	FILE *fp = fopen ( path, READ_MODE );
	if ( fp == NULL )
	{
		printf ( "open error" );
		return -1;
	}

	/*
	  *   複製檔案內容到快取陣列save[][]中	
	  */
	while ( fgets(save[i], BUFFER_SIZE, fp) )
	{
        i++;
  	}

    fseek ( fp,0,SEEK_SET );//重新定位到檔案開始處
	while(fgets(linebuffer, BUFFER_SIZE, fp))
	{
		k++;
		/*
		 *  在檔案中查詢符合條件的那一行內容,並記錄當前行數
		 */
		sscanf ( linebuffer, "%[^=]=%[^=]", buffer1, buffer2 );
		if ( !strcmp (keyword, buffer1) )
		{
			k--;
            break;
		}
	}
	
     /*
	  *   將要修改的內容寫入快取中
	  */
    sprintf ( buffer2, "%d", data );//將整數轉換成字串
    buffer2[strlen(buffer2)] = '\n';
    buffer1[strlen(buffer1)] = '=';
	strcat(buffer1, buffer2);
	strncpy(save[k],buffer1,BUFFER_SIZE);

	/*
	 *   清空檔案內容
     */
    fseek(fp,0,SEEK_SET);
    truncate("./test.txt",0);//clean test.txt

	/*
	 *   將快取中的資料按行寫入檔案中
	 */
    fseek(fp,0,SEEK_SET);
    for(j=0;j<i;j++)
   	{
        fwrite(save[j],strlen(save[j]),1,fp);
    }
    
    fclose(fp);
	return 0;
}

void String_Isdigit(char *src, char *dst)
{
    int i = 0;
    while ( src[i] != '\0' )
    {
        if (isdigit(src[i]))
            dst[i] = src[i];
        else dst[i] = ' ';
        ++i;
    }
    dst[i] = '\0';
} 

int Read_Line_Data ( char *path, int data, char *keyword )
{

    /*
     *linebuffer:讀取檔案中的一行存入的緩衝
     *buffer1:一行中第一個欄位的存入緩衝
     *buffer2:一行中第二個欄位的存入緩衝
     */
	char linebuffer[BUFFER_SIZE] = {0};
	char buffer1[BUFFER_SIZE] = {0};
	char buffer2[BUFFER_SIZE] = {0};
	
    /*
	 * FILE_NAME是檔名,r+代表可以讀寫檔案
	  */
	FILE *fp = fopen(path, READ_MODE);
	if ( fp == NULL )
	{
		printf ( "open error" );
		return -1;
	}

	while(fgets(linebuffer, BUFFER_SIZE, fp))
	{
		/*
		 *  在檔案中查詢符合條件的那一行內容
		 */
		sscanf ( linebuffer, "%[^=]=%[^=]", buffer1, buffer2 );
		if ( !strcmp (keyword, buffer1) )
		{
            break;
		}
	}
	
     /*
	  *   將要修改的內容寫入快取中
	  */
	memset ( buffer1, 0, sizeof(buffer1) );
    String_Isdigit (buffer2,buffer1 );
    sscanf ( buffer1, "%d", &data );
	printf("%s=%d\n", keyword,  data);
    
    fclose(fp);
	return 0;
}


int main ( int argc, char **argv )
{
    int mic_data = 0;
    int spk_data = 0;

    if ( argc <3 )
    {
        printf("It need 3 params!\n");
        return -1;
    }
    
    mic_data = atoi ( argv[2] );
    spk_data = atoi ( argv[1] );

    Write_Line_Data ( FILE_NAME, spk_data, SPK_KW );
    Write_Line_Data ( FILE_NAME, mic_data, MIC_KW );

	Read_Line_Data ( FILE_NAME, spk_data, SPK_KW );
    Read_Line_Data ( FILE_NAME, mic_data, MIC_KW );

    return 0;
}

sound.ini
spk=122
mic=335



相關推薦

linux C 修改文字檔案指定內容

1、可隨意修改內容 /* * Author:aniu12<[email protected]> * Date: 2014.02.13 */ #include<stdio.h> #include<stdlib.h> #in

MFC修改CStdioFile檔案指定

程式不復雜,所以在這裡只敘述一下實現的過程。 (1)先定義一個CStringList  strText變數,將CStdioFile檔案中的資料逐行讀入strText中。 (2)刪除strText指定行,用修改後的資料重新寫入strText。 (3)最後將strText中資料

shell指令碼抽取文字檔案指定字串的方法:sed+grep方法、awk+grep方法(必要時可以聯合sed以及grep)、grep+cut方法

在linux中經常要對一些動態的文字檔案抽取指定的字串,比如執行ps命令後想要獲取指定的執行程序(如ps自己)的PID號(同一個程序每次啟動的時候pid號是隨機分配的)。該怎麼辦呢?當然,可以用一些擷取字串的方法,這裡介紹一下用2種方法來解決這類問題。 一、sed+grep方法: 首先大概瞭

c語言刪除檔案指定,更新檔案

有時候我們需要刪除檔案的某一行,來更新檔案,在這我個人擴充套件了一個函式,以刪除指定條件的行。 1 static void UpdateHistoryFile(void) 2 { 3 FILE *fin,*fout; 4 int counter = 1; 5 STes

用批處理實現文字檔案指定字串的替換 zz

我沒注意到“cmd /v:on /c”,抱歉。但是還有問題,被替換的文字在行尾多了許多的空格,原因是echo !TMP:%SCONTENT%=%DCONTENT%! >> %TMPFILE%這條語句的">>"前多了不必要的空格。檔名帶空格的問題容易解決,下面是我修改過的:@echo o

使用Python刪除文字檔案的部分內容

為了學習英語,我把從網上下載下來的電影轉換成純MP3檔案,放到iTouch裡去了,這樣就可以直接練習聽力了,另外把下載下來的字幕也放進去,聽不懂的時候可以看,但有一個問題,網上載下來的字幕格式都如下所示:  7 00:01:44,789 --> 00:01:51,019

Java 替換資料夾下所有檔案指定內容

我的上一篇部落格提到了找到檔案中的中文。之前的程式碼還可以做一個擴充套件。可以作為一個強大的查詢功能使用。關鍵字查詢,這個功能大家可以思考一下,今後我的部落格也會去貼上這樣的關鍵字查詢的功能的程式碼,能跟大家討論分析一下。 今天的替換的功能也是基於上篇

替換檔案指定內容並儲存之sed命令

常用選項:-n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 引數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。 -e∶直接在指令列模式上進行 sed 的動作編輯; -f∶

linux c刪除檔案指定內容指定

用C語言來操作檔案內容還是有點煩的(尤其是刪除內容,或者是修改非等長度的內容),沒有現成的API呼叫,只能自己手動寫; 網上查了下資料基本就兩個方案: 1、增加個臨時檔案;把原始檔內容逐個位元組或者逐行讀取出來,然後修改或者丟棄,放到臨時檔案中,當把原始檔中所有內容過濾後,

linux檔案操作—獲取文字指定內容

1、用fgets函式可以讀取檔案中某行的資料,某列資料就必須一個一個讀入每行的第幾個字元,再存入到一個字串當中。 2、使用strncpy函式取指定行的某一段 char * strncpy(char *s1,char *s2,size_t n);   將字串s2中最多n

C#:讀取html模板檔案,並替換修改檔案指定值,儲存為修改後的檔案

1.準備html模板檔案:Pages/Device/DeviceModel8.html   2 using System.IO:讀取檔案內容,並替換指定內容                  &nbs

java檔案操作 (1)——判別指定檔案是否存在,讀取檔案修改時間和大小,讀取文字檔案內容,向文字檔案寫入指定內容

任務要求: 完成一個java application應用程式,判別指定路徑下指定檔名的檔案是否存在。 如果指定檔案存在,讀取並分別顯示其修改時間和檔案大小等屬性。 以文字方式開啟某一指定路徑指定檔名的文字檔案,讀取其內容並顯示。 以文字方式向某

linux如何將大檔案按照指定數分割成多個小檔案

將一個大檔案分成若干個小檔案方法例如將一個BLM.txt檔案分成字首為 BLM_ 的1000個小檔案,字尾為係數形式,且字尾為4位數字形式先利用wc -l BLM.txt       讀出 BLM.txt 檔案一共有多少行再利用 split 命令split -l 2482 .

Python修改檔案指定插入內容

需求:批量修改py檔案中的類屬性,為類增加一個core = True新的屬性 原py檔案如下 a.py class A(): description = "abc" 現在有一個1.txt文字,內容如下,如果有py檔案中的description跟txt文字中的一樣,則增加

獲取指定目錄下,指定副檔名的檔案(包含子目錄的),把這些檔案的絕對路徑寫入到一個文字檔案

題目: 獲取指定目錄下,指定副檔名的檔案(包含子目錄中的),把這些檔案的絕對路徑寫入到一個文字檔案中。 思路: 1.必須深度遍歷 2.要在遍歷的過程中進行過濾,將符合條件的內容儲存到容器中 3.對容器中的內容進行遍歷並將絕對路徑寫入到檔案中 程式碼: import java.io

Linux c : 遍歷並刪除指定目錄下的所有檔案

系統:ubuntu17.10 遍歷並刪除指定目錄下的所有檔案 #include <dirent.h> #include <stdio.h> #include <string.h> int main() {     &

.net C# web程式執行錯誤日誌寫入文字檔案

網上找的原始碼,自己根據實際情況進行了修改,能將日誌儲存在發不出來的web程式根目錄下的ErrorLog資料夾內。 #region 建立錯誤日誌 ///-------------------------------------

C#程式:如何修改xml檔案的節點(資料)(

要想在web等程式中實現動態的資料內容給新(如網頁中的Flash),不會更新xml檔案中的節點(資料)是遠遠不夠的,今天在這裡說一個簡單的xml檔案的更新,方法比較基礎,很適合初學者看的,保證一看就懂! ------------------程式環境下xml檔案中的節點、元

如何用python讀取文字指定內容

1 利用python的readlines()函式: <strong><span style="font-size:24px;"> </span><span style="font-size:14px;">fobj = op

批處理替換文字檔案的字串,並保留換

@echo on REM --- File Name:ReplaceString.bat----- REM ---Call Method---- REM ---ReplaceString "SrcFileName" "TargetFileName" "SrcStr" "TargetStr" ---- s