C 文件处理将随机字符附加到文件中
C File Handling Appending Random Characters into File
以下代码块创建一个字符串
void generateDot(struct node **head, char *str){
if(*head == NULL){
return;
}
else{
struct node *itr = *head;
generateDot(&(itr->left), str);
if(itr->parent){
char buff[3];
snprintf(buff, 3, "%d", itr->parent->data);
strcat(str, buff);
strcat(str, "--");
snprintf(buff, 3, "%d", itr->data);
strcat(str, buff);
strcat(str, "\n");
}
generateDot(&(itr->right), str);
}
}
以下代码块将字符串写入文件:
char str[] = "";
generateDot(&head, str);
printf("%s", str);
FILE *fhand = fopen("1.dot", "w");
fputs(str, fhand);
fclose(fhand);
当我打印 str
时,它按预期打印。但是,即使将相同的 str
打印到文件中,文件的第二行也会显示意外字符,而不管 str
是什么。
例如,当str
为:
3--1
7--3
3--4
19--10
7--19
19--20
文件包含:
3--1
`F
w
3--4
19--10
7--19
19--20
非常感谢任何帮助。
当您 strcat(str, buff)
写入相邻的未分配内存时。这会调用未定义的行为,任何事情都可能发生。
当您打印 str
时,内存恰好与您所写的一样。但是 fopen
和 fputs
中的某些东西分配了更多的内存,用垃圾覆盖了 str
的未分配部分。
您需要为 str
分配足够的内存。由于您不知道需要多少内存,因此最好在 generateDot
和 return 字符串中进行分配和重新分配。
以下代码块创建一个字符串
void generateDot(struct node **head, char *str){
if(*head == NULL){
return;
}
else{
struct node *itr = *head;
generateDot(&(itr->left), str);
if(itr->parent){
char buff[3];
snprintf(buff, 3, "%d", itr->parent->data);
strcat(str, buff);
strcat(str, "--");
snprintf(buff, 3, "%d", itr->data);
strcat(str, buff);
strcat(str, "\n");
}
generateDot(&(itr->right), str);
}
}
以下代码块将字符串写入文件:
char str[] = "";
generateDot(&head, str);
printf("%s", str);
FILE *fhand = fopen("1.dot", "w");
fputs(str, fhand);
fclose(fhand);
当我打印 str
时,它按预期打印。但是,即使将相同的 str
打印到文件中,文件的第二行也会显示意外字符,而不管 str
是什么。
例如,当str
为:
3--1
7--3
3--4
19--10
7--19
19--20
文件包含:
3--1
`F
w
3--4
19--10
7--19
19--20
非常感谢任何帮助。
当您 strcat(str, buff)
写入相邻的未分配内存时。这会调用未定义的行为,任何事情都可能发生。
当您打印 str
时,内存恰好与您所写的一样。但是 fopen
和 fputs
中的某些东西分配了更多的内存,用垃圾覆盖了 str
的未分配部分。
您需要为 str
分配足够的内存。由于您不知道需要多少内存,因此最好在 generateDot
和 return 字符串中进行分配和重新分配。