为什么我的文件输出被覆盖?

卡里奥

我的程序接受用户输入,并将其存储在我定义为结构的Records数组中struct Record
用户输入是该结构的字段。一切都遵循无错误,但似乎我无法正确设置格式。我的程序一直在询问用户输入,直到当用户询问是否有记录时才输入“ n”。
一旦没有更多的记录,程序将循环遍历创建的记录,并用选项卡将这些记录的文件打印隔开,最后以换行符开始下一条记录。但是,它不是以新的行开始并以相同的方式打印另一条记录,而是会覆盖先前打印的记录,并进一步标记下一条记录。
是什么原因导致这种情况发生?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct Record
{
    char fname[51];
    char lname[51];
    char address[51];
    char city[51];
    char state[51];
    char zipcode[51];
    char phoneNumber[51];
};

int main()
{
    FILE *fileWriter;
    const char filename[] = "data.txt";
    char answer = 'y';
    int size = 1;
    int i = 0;
    struct Record *records;
    struct Record *records_temp = NULL;

    while(answer == 'y' || answer == 'Y')
    {
        struct Record *records_temp = calloc((size),sizeof(*records));         
        records = records_temp;
        printf("First Name: \n");
        scanf("%s", records[size-1].fname);

        printf("Last Name: \n");
        scanf("%s", records[size-1].lname);

        printf("Address: \n");
        scanf(" %[^\n]", records[size-1].address);

        printf("City: \n");
        scanf("%s", records[size-1].city);

        printf("State: \n");
        scanf("%s", records[size-1].state);

        printf("Zipcode: \n");
        scanf("%s", records[size-1].zipcode);

        printf("Phone Number: \n");
        scanf("%s", records[size-1].phoneNumber);
        //stores all record info

        printf("Are there anymore records? [y/n] ");
        scanf(" %c", &answer);
        if(answer == 'y' || answer == 'Y')
        {
            size++;
            printf("\n");
        }
    }
        //open file

    fileWriter = fopen(filename,"wb");

    if(fileWriter != NULL)
    {
        for(;i< size; i++)
        {
            fprintf(fileWriter,"%s\t",records[i].fname);
            fprintf(fileWriter,"%s\t",records[i].lname);
            fprintf(fileWriter,"%s\t",records[i].address);
            fprintf(fileWriter,"%s\t",records[i].city);
            fprintf(fileWriter,"%s\t",records[i].state);
            fprintf(fileWriter,"%s\t",records[i].zipcode);
            fprintf(fileWriter,"%s\n",records[i].phoneNumber);
        }
        free(records);
        fclose(fileWriter);
    }
    else
    {
        printf("Error opening file.");   
    }
}
蒂亚戈·梅德罗斯(Thiago Medeiros)

我对代码进行了一些更改,但是我认为您应该在此处将链表用作数据结构,它更简单并且消耗更少的内存。我做了一些尝试,一切顺利。:)希望能对您有所帮助!

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct Record Record;

struct Record
    {
        char fname[51];
        char lname[51];
        char address[51];
        char city[51];
        char state[51];
        char zipcode[51];
        char phoneNumber[51];

        Record *next;
    };


int main()
{
    FILE *fileWriter;
    const char filename[] = "data.txt";
    char answer = '\0';
    // int size = 1;
    // int i = 0;
    Record *records = NULL;
    Record *records_first = NULL;
    Record *records_previous = NULL;

    fileWriter = fopen(filename,"wb");

    if(fileWriter != NULL) {

        for( ; ; ) {
            records = (Record*) malloc(sizeof(Record));  

            if(records_first == NULL)
                records_first = records;

            if(records_previous != NULL)
                records_previous->next = records;

            records = records_first;
            printf("First Name: \n");
            scanf("%s", records->fname);
            fprintf(fileWriter,"%s\t",records->fname);

            printf("Last Name: \n");
            scanf("%s", records->lname);
            fprintf(fileWriter,"%s\t",records->lname);

            printf("Address: \n");
            scanf(" %[^\n]", records->address);
            fprintf(fileWriter,"%s\t",records->address);

            printf("City: \n");
            scanf("%s", records->city);
            fprintf(fileWriter,"%s\t",records->city);

            printf("State: \n");
            scanf("%s", records->state);
            fprintf(fileWriter,"%s\t",records->state);

            printf("Zipcode: \n");
            scanf("%s", records->zipcode);
            fprintf(fileWriter,"%s\t",records->zipcode);

            printf("Phone Number: \n");
            scanf("%s", records->phoneNumber);
            fprintf(fileWriter,"%s\t\n\n",records->phoneNumber);

            records->next = NULL;
            records_previous = records;

            printf("Are there anymore records? [y/n] ");
            scanf(" %c", &answer);

            if(tolower(answer) != 'y') {
                free(records);
                fclose(fileWriter);
                break;
            }
        }

    } else
        printf("Error opening file.");

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章