我尝试使用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
答案 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 */
}