2014-11-21 85 views
-1

比方說,我有一個包含兩行文本文件:如何在C中編輯文本文件中的特定部分行?

Item="1" Name="Sword" Damage="2.5" 
Item="2" Name="Axe" Damage="3" 

我怎樣才能改變斧在與C的文本文件的損壞3.5?

EDITED:這是我如何閱讀文本文件的每一行,並且我正在用文本信息填充一個gtk列表存儲區,dhd_LocalizaItem是它的一個函數,以獲取「」中的內容。 Item =「1」,我會用那個函數捕獲1,但所有gtk函數的工作正常,正如我所說的,我現在需要一個C函數/命令來編輯文本文件中某一行的特定部分。

void get_message() { 

    GtkTreeIter dhd_iter; 
    FILE * dhd_pFile; 

    char dhd_G_CodProduto[256]; 
    char dhd_G_NomeProduto[256];  
    char dhd_contaItem[16]; 
    char dhd_quantidade[32]; 
    char dhd_valorItem[32];  
    char dhd_getbuf[1024]; 
    dhd_chekDel = 0; 
     dhd_pFile = fopen ("Logs/logCancelar.txt", "r"); 

     if(dhd_pFile == NULL) { 
     printf("Erro! Nao foi possivel abrir o log de cancelamento!\n"); 
     } 
    else { 
      while((fgets(dhd_getbuf, sizeof(dhd_getbuf), dhd_pFile))!=NULL) { 

     dhd_LocalizaItem (dhd_getbuf, dhd_stringItem); 
    dhd_restou = dhd_LocalizaItem("Item=" , dhd_getbuf); 
    strcpy(dhd_contaItem,dhd_restou); 

     dhd_LocalizaItem (dhd_getbuf, dhd_strong); 
    dhd_restou = dhd_LocalizaItem("CodProduto=" , dhd_getbuf); 
    strcpy(dhd_G_CodProduto,dhd_restou); 

    dhd_LocalizaItem (dhd_getbuf, dhd_strung); 
    dhd_restou = dhd_LocalizaItem("NomeProduto=" , dhd_getbuf); 
    strcpy(dhd_G_NomeProduto,dhd_restou); 

    dhd_LocalizaItem (dhd_getbuf, dhd_streng); 
    dhd_restou = dhd_LocalizaItem("Quantidade=" , dhd_getbuf); 
    strcpy(dhd_quantidade,dhd_restou); 

    dhd_LocalizaItem (dhd_getbuf, dhd_stringTotal); 
    dhd_restou = dhd_LocalizaItem("ValorTotal=" , dhd_getbuf); 
    strcpy(dhd_valorItem,dhd_restou); 

    gtk_list_store_append(GTK_LIST_STORE(mainWindowObjects.liststore), &dhd_iter); 
    gtk_list_store_set(GTK_LIST_STORE(mainWindowObjects.liststore), &dhd_iter, 
       ITEM, dhd_contaItem, 
         CODIGO, dhd_G_CodProduto , 
         DESCRICAO, dhd_G_NomeProduto , 
         QTD, dhd_quantidade, 
         VALOR, dhd_valorItem, 
         -1); 
      } 
    } 





    fclose(dhd_pFile); 
} 

對不起,我的英語壞人每個人。

+0

查看'fscanf'函數 – xjedam 2014-11-21 20:52:36

+0

對於每一行:讀取它,根據需要進行調整,然後寫入第二個文件。然後刪除第一個文件並重命名第二個。發佈你的嘗試。否則它看起來像是在做你的功課。 – chux 2014-11-21 20:56:52

+0

但如何調整呢?我知道如何閱讀每一行。對不起,我還是新手編程。 – nightk 2014-11-21 20:59:26

回答

0
#include <stdio.h> 
#include <string.h> 

typedef struct arms { 
    int id; 
    char name[32]; 
    double damage; 
} Arms; 

int read_arms(Arms *a, FILE *fp){ 
    return fscanf(fp, " Item=\"%d\" Name=\"%[^\"]\" Damage=\"%lf\"", 
     &a->id, a->name, &a->damage); 
} 
void write_arms(Arms *a, FILE *fp){ 
    fprintf(fp, "Item=\"%d\" Name=\"%s\" Damage=\"%3.1f\"\n", 
     a->id, a->name, a->damage); 
} 

#define ARMSFILE "arms.dat" 

void change_damage_by_name(const char *name, double damage){ 
    FILE *fin, *fout; 
    Arms a; 

    fin = fopen(ARMSFILE, "r"); 
    fout = fopen("arms.tmp", "w"); 
    while(EOF!=read_arms(&a, fin)){ 
     if(strcmp(a.name, name)==0) 
      a.damage = damage; 
     write_arms(&a, fout); 
    } 
    fclose(fin); 
    fclose(fout); 
    remove(ARMSFILE); 
    rename("arms.tmp", ARMSFILE); 
} 

int main(void){ 
    change_damage_by_name("Axe", 3.5); 

    return 0; 
} 
+0

我現在會測試它。 – nightk 2014-11-21 23:29:02

+0

嗯,我必須做很多改變,因爲Gtk和我的代碼,但你使用'fscanf'和'fprintf'的方式清除了我的想法。它正在工作!非常感謝你! – nightk 2014-11-22 00:09:25

-4

可能試圖製作某種JavaScript腳本。我從來沒有嘗試在網站/ HTML/CSS以外的地方製作腳本,但這是我的想法。

製作一個名爲edit.js的文件 最好用記事本,記事本++或某種編碼編輯器打開它。記事本的作品,但我建議Notepad ++;免費。 實際上,JavaScript不允許編寫,修改或編輯任何文件,只能讀取它們;這是由於安全[也許是法律]的原因。所以這是我推薦的:

第一步:將你的文本文件和一個新的JavaScript文件上傳到一個在線主機,或者如果我能正確地想出來,就把它放在一個文件夾的硬盤上。 轉換文本文件轉換成.html格式,它可以這樣做:

另存爲>文件類型:所有文件類型>文件名:mytextdocument.html

而且還創造了.js文件,它由用記事本做同樣的事情。 html文件應該包含一些關於此的內容。

<html> 
    <head> 
    <title>My Text Document</title> 
    <script src="myscript.js"></script> 
    </head> 
    <body id="body" onLoad="replaceItem(); saveTextAsFile();"> 
    <div id="content"> 
     <ul> 
     <li id="1" value="sword">Item="1" Name="Sword" Damage="2.5"</li> 
     <li id="2" value="axe">Item="2" Name="Axe" Damage="3"</li> 
     </ul> 
    </div> 
    </body> 
</html> 

.js文件應該在這行;

function replaceItem() { 
    var x = document.getElementById("2"); 
    x.innerHTML = "Item='2' Name='Axe' Damage='3.5'"; 

} 
    function saveTextAsFile() 
{ 
    var textToWrite = document.getElementById("content").innerHTML; 
    var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'}); 
    var fileNameToSaveAs = "items.txt"; 

    var downloadLink = document.createElement("a"); 
    downloadLink.download = fileNameToSaveAs; 
    downloadLink.innerHTML = "Download File"; 
    if (window.webkitURL != null) 
    { 
     // Chrome allows the link to be clicked 
     // without actually adding it to the DOM. 
     downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob); 
    } 
    else 
    { 
     // Firefox requires the link to be added to the DOM 
     // before it can be clicked. 
     downloadLink.href = window.URL.createObjectURL(textFileAsBlob); 
     downloadLink.onclick = destroyClickedElement; 
     downloadLink.style.display = "none"; 
     document.body.appendChild(downloadLink); 
    } 

    downloadLink.click(); 
} 

注:

在打開該HTML文件之前,確保你編輯從JavaScript文件的內容,以你想要的。

+2

這不能回答OP的問題,因爲他特別要求C – 2014-11-21 21:11:38

+0

對不起@PhilippMurry,當他說我很困惑,因爲我從來沒有聽說過這個詞,因此認爲他的意思是C驅動OO – 2014-11-21 21:13:18

+5

你從來沒有聽說過C編程語言? – 2014-11-21 21:24:16

相關問題