2014-07-25 122 views
1

我试图用C保存一些简单的文本文件中的数据。 问题是,当我将缓冲区写入文件时,它会被写入两次。 我不知道为什么。我试着用fwrite和fputs;同样的问题,欢迎任何帮助。缓冲区写入文件两次

void addEdge(graph_t *graph, int src, int dest) 
{ 
    FILE *f = fopen("C:\\graph.txt", "a"); 
    if (f == NULL) 
    { 
     printf("Error opening file!\n"); 
     exit(1); 
    } 
    char *c1 =malloc(8* sizeof(char *)),c2[2]="\0"; 
    itoa(src, c1, 10); 
    itoa(dest, c2, 10); 
    /* print some text */ 
    char text[2] = "::"; 
    strcat(c1,text); 
    printf("c1 before %s \n",c1); 
    strcat(c2,"\0"); 
    strcat(c1,c2); 
    printf("c1 after %s ++++++++ c2 %s \n",c1,c2); 

    //fseek(f,0,SEEK_END); 
    //fprintf(f, "%s \n", c1); 
    ///fputs(c1,f); 
    char* pos; 
    pos = strchr(c1, '\0'); 
    int index = (int)(pos - c1); 
    fwrite (c1 , sizeof(char), index , f); 
    fclose(f); 
/**************** some other stuff */ 
} 

这段代码的执行应该给我这个对VAR src = 2和dest = 18

2::8 

,但在文件中我得到这个

2::1818 
+1

我不知道你是用“\ 0”的在你的代码做什么。他们在那里有什么?例如与strcat。字符串或者已经有一个空终止字符,或者它没有。如果你试图将另一个\ 0追加到尾部,strcat首先必须在最后找到\ 0,然后再添加另一个?为什么? –

+1

使用strchr查找\ 0与使用strlen完全相同。不是吗? –

回答

1

FOPEN与模式“a”表示追加。这意味着如果您的文件包含任何先前的数据,那么这些数据将保留,并且您写入的任何内容都将追加到最后。你确定这不是你的问题吗?尝试使用“w”替换旧内容。

+0

这是解决方案,我改变了模式为+,并使用上面的代码来简化:D谢谢 – Neil

1

这里有更多的代码比真正必要的。尝试这个代替:

void addEdge(graph_t *graph, int src, int dest) 
{ 
    FILE *f = fopen("C:\\graph.txt", "a"); 
    if (f == NULL) 
    { 
     printf("Error opening file!\n"); 
     exit(1); 
    } 
    fprintf(f, "%d::%d", src, dst);  /* <== much simpler, no? */ 
    fclose(f); 
/**************** some other stuff */ 
} 
+0

谢谢我试过但我仍然有同样的问题.. 输出: 2 :: 1717 5 :: 1414 9 :: 1010 – Neil

0
void addEdge(graph_t *graph, int src, int dest) 
{ 
    FILE *f = fopen("C:\\graph.txt", "a"); 
    if (f == NULL) 
    { 
     printf("Error opening file!\n"); 
     exit(1); 
    } 
    char *c1 =malloc(8* sizeof(char *)),c2[2]="\0"; 

上述尝试的线路分配8个字节C1。如果malloc()失败,它将返回NULL。以下行尝试写入分配的内存,导致“NULL指针分配”运行时错误。上述行不安全。由itoa()生成的字符串长度可以达到33字节(包括可选标记和终止sting终止符)。由c1指向的分配内存块只有8个字节。最坏的情况,itoa()可能超出分配的内存,覆盖相邻的内存。

itoa(dest, c2, 10); 

上面这行更加不安全;其中数组c2 []只有两个字节。

/* print some text */ 
    char text[2] = "::"; 

上面的代码是坏的代码。字符串“::”等同于三个字节的{':',':','\ 0'}。字符数组“文本”只有两个字节。可能的话,这会导致在“文本”字符串末尾写入一个字节;导致覆盖相邻的存储器。

strcat(c1,text); 

由于置于c1中的字符串可能已经大于分配的空间,上述行同样危险。假定变量文本可能没有正确终止(假设字符串终止符位于分配的空间之外)。

printf("c1 before %s \n",c1); 
    strcat(c2,"\0"); 

上述行没有任何用处。数组c2 [2]中的字符串已经溢出分配的内存。

strcat(c1,c2); 

上面的行将(溢出的)数组c2值追加到c1的末尾。

printf("c1 after %s ++++++++ c2 %s \n",c1,c2); 

    //fseek(f,0,SEEK_END); 
    //fprintf(f, "%s \n", c1); 
    ///fputs(c1,f); 
    char* pos; 
    pos = strchr(c1, '\0'); 
    int index = (int)(pos - c1); 
    fwrite (c1 , sizeof(char), index , f); 
    fclose(f); 
/**************** some other stuff */ 
} 

不知道确切的目标,这里是在重新写一个尝试:

void addEdge(graph_t *graph, int src, int dest) 
    { 
    FILE *f = NULL; 

    errno=0;       /* Requires the header 'errno.h' */ 
    f = fopen("C:\\graph.txt", "a"); 
    if(NULL == f) 
     { 
     printf("Error opening file! errno[%d]\n", errno); 
     exit(1); 
     } 

    /* print some text */ 
    fprintf(f, "%d::%d", dest, src); 
    fclose(f); 
/**************** some other stuff */ 
}