缓冲区写入文件两次

时间:2014-07-25 23:43:55

标签: c file

我尝试使用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

3 个答案:

答案 0 :(得分:1)

以“a”模式fopen意味着追加。这意味着如果您的文件包含任何以前的数据,那么这些数据将保留,您编写的任何内容都将附加到末尾。你确定这不是你的问题吗?尝试使用“w”替换旧内容。

答案 1 :(得分: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 */
}

答案 2 :(得分: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(src, c1, 10);

上述行不安全。由itoa()生成的字符串可以具有最多33个字节的长度(包括可选符号和终止sting终止符)。 c1指向的已分配内存块仅为8个字节。最糟糕的情况是,itoa()可能超出了分配的内存,覆盖了相邻的内存。

    itoa(dest, c2, 10);

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

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

以上行是错误的代码。字符串“::”等同于{':',':','\ 0'},即三个字节。 char数组'text'只有两个字节。可能,这将导致超出'text'字符串末尾的写入一个字节;导致覆盖相邻的内存。

    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 */
}