C - перенаправление ввода / вывода файла и EOF - PullRequest
0 голосов
/ 19 ноября 2018

мой класс C требует, чтобы мы читали из файла с неизвестным количеством записей, но с известным форматом, который выглядит следующим образом:

имя, фамилия

адресная строка 1

адресная строка 2

почтовый индекс

Таким образом, мы динамически распределяем массив указателей на структуры, и я создал функцию getData, которая будет использовать метод get для построчного чтения и правильного хранения всего. Моя самая большая проблема - как сделать так, чтобы он прекратил сбор данных, когда файлу больше нечего читать. Я грубо придумал 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

Отладка была проблемой, потому что я не могу одновременно использовать перенаправление ввода / вывода и отладчик Visual Studio. Если у кого-то есть какие-либо предложения относительно того, как я могу отладить, я был бы признателен! Но в противном случае я хотел бы получить отзыв о том, что я получил.

...