Почему этот код записывает только первое и последнее вхождения nome, cognome и cf? - PullRequest
0 голосов
/ 31 января 2019

Почему этот код записывает только первые и последние вхождения nome, cognome и cf?

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

typedef struct data{
    char nome[20];
    char cognome[20];
    char cf[20];
    }data;

void leggi_file(FILE *input, data **array, int *dim);
void aggiorna(data *vect, char *nome, char *cognome, char *cf, int dim);
void scrivi_file(FILE *output, data *vect, int dim);


int main(void){
    FILE *input, *output; 
    input = fopen("prog1file.txt", "r");
    output = fopen("prog1file2.txt", "w");
    data *vect1;
    int dim_vect1 = 0;

    leggi_file(input,&vect1,&dim_vect1);

    char *nome="Michele", *cognome="Nappi", *cf="nppmhl69p22b119f";
    aggiorna(vect1, nome, cognome, cf, dim_vect1);

    scrivi_file(output, vect1, dim_vect1);

    return 0;
}   

void leggi_file(FILE *input, data **array, int *dim){
    char nome[20], cognome[20], cf[17];
    int i;
    while(fscanf(input, "%s %s %s", nome, cognome, cf) == 3)
        (*dim)++;
    *array = malloc((*dim + 1) * sizeof(data));
    rewind(input);
    for(i=0; i<(*dim); i++)
        fscanf(input, "%s %s %s", array[i]->nome, array[i]->cognome, array[i]->cf);
}

void aggiorna(data *vect, char *nome, char *cognome, char *cf, int dim){
    strcpy(vect[dim].nome, nome);
    strcpy(vect[dim].cognome, cognome);
    strcpy(vect[dim].cf, cf);
}

void scrivi_file(FILE *output, data *vect, int dim){
    int i;
    for(i=0; i<(dim+1); i++)
        fprintf(output, "%s %s %s\n", vect[i].nome, vect[i].cognome, vect[i].cf);
}

В него должны записываться вхождения nome, cognome и cf, которые хранятся в первом файле ввторой, а затем добавить еще один, который был передан из основного.Почему он пишет только первый и последний?

В выходном файле я получаю что-то вроде этого:

Giuseppe Nappo nppgspmhl65t23c126a


Michele Nappi nppmhl69p22b119f

1 Ответ

0 голосов
/ 31 января 2019

В функции leggi_file, array является указателем на указатель структур.Думайте об этом как указатель на массив структур.Это, безусловно, не массив указателей на структуры (как указывает использование array[i]->nome).

Правильный способ - разыменовать указатель для получения массива ( структуры *)1008 *), как в (*array)[i].nome.

С array[i]->nome вы рассматриваете array как массив указателей, а это не так.Это (эффективно, но не семантически) указатель на массив.

Используя array[i]->nome, вы выйдете за пределы памяти на array, что приведет к неопределенному поведению .Вам повезло (или не повезло, в зависимости от точки зрения), что код не дает сбоя.

Единственная строка, которую вам нужно изменить, это:

fscanf(input, "%s %s %s", array[i]->nome, array[i]->cognome, array[i]->cf);

Который вы должныизменить на

fscanf(input, "%s %s %s", (*array)[i].nome, (*array)[i].cognome, (*array)[i].cf);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...