C-文件输入/输出重定向和EOF

时间:2018-11-19 01:10:17

标签: c eof

我的C类使我们从条目数未知但格式已知的文件中读取文件,如下所示:

名,姓

地址行1

地址行2

邮政编码

因此,我们正在动态分配指向结构的指针数组,并且我制作了一个函数getData,它将使用gets逐行读取并适当地存储所有内容。我最大的问题是如何制作文件,以便在文件无剩余可读取时停止收集数据。我已经粗略提出了while((strcpy(ptr[i].name, buffer))!=EOF),我相信这毫无意义,但是似乎有些有用,尤其是因为它可以正确打印出几乎所有条目。这是代码:

    #define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "address.h"

struct AddressBook {
    char *name[10];
    char *address[50];
    int zip;
};

typedef struct AddressBook adds;

void getData(adds *ptr);

int main() {
    //adds *ptrArr[50];
    int size = 50;
    adds *ptrs = (adds*)calloc(size, sizeof(adds*)); //array of 50 ptrs allocated dynamically

    if (ptrs == NULL) {
        printf("Bad memory allocation...exiting.");
        exit(0);
    }
    else
        printf("Allocation successful...\n");
    getData(ptrs);

    system("pause");
    return 0;
}

void getData(adds *ptr) {
    printf("Gathering data...\n");
    char buffer[50];
    int i = 0;
    gets(buffer);
    while((strcpy(ptr[i].name, buffer))!=EOF) {
        if (i > 0) {
            gets(buffer);
            strcpy(ptr[i].name, buffer);
        }
        /*gets(buffer);
        strcpy(ptr[i].name, buffer);*/
        gets(buffer);
        strcpy(ptr[i].address, buffer);     
        gets(buffer);
        strcat(ptr[i].address, " ");
        strcat(ptr[i].address, buffer);
        gets(buffer);
        ptr[i].zip = atoi(buffer);
        printf("Printing data for line %d...\n", i);
        printf("name is: %s\naddress is: %s\nzip is: %d\n", ptr[i].name, ptr[i].address, ptr[i].zip);
        printf("\n");
        i++;
    }
}

正在发生两个问题: 1.当我打印时,它将最多打印50个条目,这只是我要的空间量,但是实际的条目数量要少得多。

2。除了第2行(或下标1),它正确打印了我们的所有条目。 如果您感到好奇,请输入以下内容:https://pastebin.com/Ph5wzFeF

这是前3个条目的输出:

Printing data for line 0...
name is: A1, A2
address is: 20294 Lorenzana Dr Woodland Hills, CA
zip is: 91364

Printing data for line 1...
name is: B1, name is: B1, name is: B1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1,
zip is: 94023

Printing data for line 2...
name is: C1, C2
address is: 5142 Dumont Pl Azusa, CA
zip is: 91112

调试一直很痛苦,因为我不能同时使用I / O重定向和Visual Studio调试器。如果有人对我如何调试有任何建议,我将不胜感激!但是,否则,我想对我所得到的东西给予一些反馈。

0 个答案:

没有答案