为什么写入文件时字符加倍(uupp)?

时间:2014-03-29 12:59:54

标签: c file-io

我已经制作了(几乎)一个程序,它将完整的行打印到文件中(除非你输入);请看一下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void getline ( FILE *filep){
    char c;int word = 100,lenmax=100;
    char *line = (char *)malloc (100),*exline,*save = line;
    printf("enter the data to be written press only enter at the end of the paragraph\n");
    while(1){
        c = fgetc ( stdin );

        if ( --word != 0){
            *line++ = c;
        }
        else{
            word = 100;
            exline = realloc(save ,lenmax += 100);
            if (exline == NULL){
                free ( line);
                exit(1);
            }
            line = exline + (lenmax-100);
        }

        if ( (*line++=c)=='\n'){
            *line = '\0';
            break;
        }

    }
    fprintf(filep,"%s",save);
    free(line);
    free(exline);
}

int main(){
    FILE *fp;
    fp = fopen("beauty.txt","w");
    getline(fp);
    return 1;
 }

问题例如,如果你写“我在这里的世界”,在控制台它会像这样打印在文件上:

hheelloo wwoorrlldd ii aamm hheerree

表示每个角色两次。请弄清楚错误。我很困惑。还告诉我是否有必要释放两个指针lineexline?是不是只有这个

free(exline);//as exline is pointing to the complete buffer

1 个答案:

答案 0 :(得分:2)

你先做

if ( --word != 0){
    *line++ = c;
}

然后

if ( (*line++=c)=='\n'){
    *line = '\0';
    break;
}

将角色两次放入line

不要同时释放lineexline,因为当您realloc时,line不再有效。 此外,只要您保持低于100个字符,exline可能根本不会被初始化。 最后,在读取字符时修改line,因此它无论如何都不是有效的堆指针。您可以保存变量save,只需使用exline即可。所以正确的方法可能是

char *line = malloc (100), *exline = line;
/* ... */
save = exline;
exline = realloc(save, lenmax += 100);
if (exline == NULL) {
    free(save);

/* ... */
free(exline);

这还可以修复超过前100个字符的其他realloc