2009-12-05 64 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