2009-12-05 68 views
4

而不是追加「ABC」(因此最終得到一個文件的完整ABCABCABC的....),無論多少次,我跑這一點,只MYFILE containst「ABC」 ... 。我該如何追加?用C失敗追加,直接覆蓋

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

int main(){ 
    char strng[10]; 
    strcpy(strng,"abc"); 
    FILE *my_file; 
    my_file = fopen("myfile","a+"); 
    if (my_file == NULL){ printf("problem\n");} 
    fwrite(strng, sizeof(strng), 1, my_file); 
    printf("appending %s\n",strng); 
    fclose(my_file); 
} 
+0

順便說一句,不相關的問題:不要使用的strcpy()。如果你的系統有,使用strlcpy()。如果你在Windows上考慮StringCchCopy()。作爲最後的手段,使用strncpy(),但請仔細閱讀其注意事項。 – asveikau 2009-12-05 20:23:39

+0

根據http://www.opengroup.org/onlinepubs/009695399/functions/fwrite.html,我使用了參數順序。什麼是正確的順序? 返回值是1(包括如果我執行命令frwite不止一次在節目中),但只有一個「ABC」還是會被寫入到文件....:/ – 2009-12-05 20:27:33

+0

可能我建議fprintf中(my_file, 「%s」,strng);代替fwrite。 – SiegeX 2009-12-05 20:30:03

回答

4

除了一個事實:

fwrite(strng, sizeof(strng), 1, my_file); 

應該是:

fwrite(strng, strlen(strng), 1, my_file); 

它爲我工作。

+0

是的,原始代碼會在文件中寫入'\ 0',並且無論他以後如何查看該文件,都必須將文件內容作爲C字符串(以nul結尾)處理。而不是fwrite(strlen),使用fputs! – 2009-12-05 20:52:14

0

不要使用sizeof,使用strlen。 sizeof是10,所以你寫的是「abc \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0」。

+1

事實上,他寫的「ABC \ 0 ......」這裏......是隨機的垃圾 – SiegeX 2009-12-05 20:27:50

+0

@SiegeX的6個字符:你說得對。 – 2009-12-06 00:13:00

0

該方案可行,的確你說該怎麼做:追加10個字符(sizeof(strng))到文件,包括\0和陣列的其餘部分。將sizeof更改爲strlen

此外,你不應該只有當您無法打開文件打印的「問題」,但也不能寫入。

最後一個問題在你的代碼 - 你宣佈main返回int,但結束程序沒有設置返回碼。如果您正確結束程序,始終返回EXIT_SUCCESS

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

#define BUF_SIZE 10 
char buf[BUF_SIZE]; 

int main(int ac, char **av) { 
    FILE *my_file; 

    strncpy(buf, "abc", BUF_SIZE-1); 
    buf[BUF_SIZE-1] = '\0'; 
    my_file = fopen("myfile", "a+"); 
    if (my_file == NULL) { 
     fprintf(stderr, "problem opening file\n"); 
     return EXIT_FAILURE; 
    } else { 
     fwrite(buf, strlen(buf), 1, my_file); 
     printf("appending %s\n", buf); 
     fclose(my_file); 
     return EXIT_SUCCESS; 
    } 
} 
+0

我也不喜歡strcpy()之後的FILE *聲明。 – SiegeX 2009-12-05 20:32:10

+0

我也不喜歡。我只修改該程序來糾正問題 – MBO 2009-12-05 20:34:26

+0

strncpy()實際上有點邪惡,因爲如果源字符串的大小與目標長度相同,它不會零終止。您可以複製BUF_SIZE-1個字符,然後手動將最後一個字符寫爲零。或者你可以使用更智能的替代品之一,比如strlcpy(),許多Unixy系統(不幸的是除了Linux),或者Windows上的StringCchCopy()。 – asveikau 2009-12-05 20:58:49

-1

當您打開文件時,流位置位於文件的開頭。爲了得到字符串,你必須在寫作之前尋求最終的結果嗎?

+3

「a +」模式將寫入位置定位在文件末尾。 – 2009-12-05 20:29:42

+0

不,他以讀取和追加模式打開文件,這就是'a +'意思是 – MBO 2009-12-05 20:30:53

+0

感謝那尼爾,我撤回了我的答案!如果是這種情況,那麼原始代碼應該會生成一個更大的文件,即使其中的內容不可顯示。事實上,隨着文件大小的增加,查看sizeof/strlen錯誤是一個很好的線索。 – 2009-12-05 20:34:05