2012-02-06 122 views
0

我試圖編輯文本文件中的一行,但在編輯文件時出現意外的行爲。我想要做的是調整看起來像一個文本的特定線(點:100)。在函數中,我通過值傳遞參數來調整新的硬幣,並用ftell-> user_point將文件偏移。我得到的輸出是奇怪的。我嘗試將文件的其餘部分複製到臨時文件中,並將其複製到一行,然後將它複製回原始文件,並將其複製到臨時文件中(即用戶點的偏移量爲ftell)。 原來這裏是外商投資企業有這樣的條目:使用臨時文件在文本文件中編輯行C

...  
_______________________________________ 
    nickname  : geo 
    password  : cuvctq 
    Name   : george 
    Surname  : papas 
    points  : 100 
    participated : 
    past draws : 0 
    Chosen No. : 
    future draws : 0 
    Registered : Sun Feb 05 19:23:50 2012 
... 

第二次編輯運行後我得到的是:

... 
    _______________________________________ 
    nickname  : geo 
    password  : cuvctq 
    Name   : george 
    Surname  : papaspoints  : 98 
    participated : 
    past draws : 0 
    Chosen No. : 
    future draws : 0 
    Registered : Sun Feb 05 19:23:50 2012 
... 
At the end of the text i get one extra \n after i edit the 
file whch is something i dont want :/ 

等進一步的編輯將破壞文字... 我也得到一個在該行的末尾EXTRA \ n的,至少我是這麼認爲的東西,是由於"r+"模式是什麼,我也不想......

void coins_adjust(int coins_new,int user_point) 
{ 
    int lines,i,ln_point_copy; 
    char buffer[50],buff_copied[50]; 
    FILE *lottary,*temp; 

    memset(buff_copied,'\0',sizeof(char)*50); 
    lottary=fopen("customers.txt","r"); 
    temp=fopen("temp.txt","w"); 
    fseek(lottary,user_point,SEEK_SET); 
    for (lines=0;lines<5;lines++) 
    { 
     memset(buffer,'\0',sizeof(char)*50); 
     if (lines==5) 
      ln_point_copy=ftell(lottary);  //from TEMP to CUSTOMERS 
     fgets (buffer ,50 , lottary); 
    } 
    coins_new+=atoi(buffer+15); 

    strncpy(buff_copied,buffer,15);  //copy 15 chars and fill with null 
    memset(buffer,'\0',sizeof(char)*50); 
    itoa (coins_new,buffer,10);   //fix the new line to be entered 
    strcat(buff_copied,buffer);   //the edited line is as it is supposed 
    strcat(buff_copied,"\n");   //to be with \n at the end. 
    puts(buff_copied); 

    printf("%s",buff_copied);fflush(stdout); 
    fprintf(temp,"%s",buff_copied); 
    for(i=getc(lottary); i!=EOF; i=getc(lottary)) //copy to temp 
    { 
     putc(i, temp); 
    } 
    fclose(lottary); 
    fclose(temp); 

    temp=fopen("temp.txt","r"); 
    lottary=fopen("customers.txt","r+"); 
    fseek(lottary,ln_point_copy,SEEK_SET); 
    for(i=getc(temp); i!=EOF; i=getc(temp))  //copy until eof 
    { 
     putc(i, lottary); 
    } 
    fclose(lottary);fclose(temp); 

} 

我調試了程序,一切似乎工作至少在什麼值傳遞給我存儲線字符的數組,但我不明白爲什麼它忽略了前一行的\n,當我嘗試將它複製回原始...似乎有一個\r字符,我無法擺脫,而我複製回原來的... 在此先感謝。

+0

爲什麼不一次一行地閱讀,如果它包含你想改變的東西然後改變它,並且把這一行寫出到新文件中。然後,要更改的行的實際位置可以在任何位置,並且如果文件的格式發生更改,則不必擔心程序。 – 2012-02-06 10:44:51

+0

@JoachimPileborg其實這就是我所做的或多或少的,但這些條目可以是數百等。所以我需要編輯線,並將其放置在它的位置。 – BugShotGG 2012-02-06 11:01:30

回答

1

我更想是這樣的:

void change_points(int new_points) 
{ 
    FILE *input = fopen("customers.txt", "r"); 
    FILE *output = fopen("temp.txt", "w"); 

    char buffer[256]; 

    while (fgets(buffer, sizeof(buffer), input)) 
    { 
     /* Look for the correct line */ 
     /* Can also use e.g. "if (strncmp(buffer, "points", 6) == 0)" 
     * if it's at the start of the line 
     */ 
     if (strstr(buffer, "points") != NULL) 
     { 
      int old_points; 

      sscanf(buffer, "%*s : %d ", &old_points); 

      /* Format how you like it */ 
      fprintf(output, "%-13s: %d\n", "points", new_points + old_points); 
     } 
     else 
      fputs(buffer, output); 
    } 

    fclose(output); 
    fclose(input); 

    /* The file "temp.txt" now contains the modifeed text */ 
    /* Copy either using "fgets"/"fputs", or using "fread"/"fwrite" */ 

    input = fopen("temp.txt", "r"); 
    output = fopen("customers.txt", "w"); 

    while (fgets(buffer, sizeof(buffer), input)) 
     fputs(buffer, output); 

    fclose(output); 
    fclose(input); 
} 

這是短,更簡單,也許更有效(超過行由行而不是字符逐個字符循環),而你行尋找可以在文件中的任何位置,而不必知道它的確切位置。

+0

那麼我需要知道它在哪裏,因爲有文件中的註冊hundrends不僅1 :(我仍然沒有得到它,但爲什麼它錯過\ n後第二次嘗試。 – BugShotGG 2012-02-07 09:42:14

+0

我重寫了我的代碼完全,它的工作原理,但我仍然不明白爲什麼它沒有工作。有些東西似乎與r +文件模式錯位。 – BugShotGG 2012-02-07 13:52:25