2

ファイルからの読み取り/書き込みに問題があり、入力を正しく表示します:

// LOAD THE LIST FROM THE FILE
struct elemento *caricalista(struct elemento *p) {
    struct elemento *punt;
    FILE * utenti = fopen ("miarubrica.txt", "r");

    char nome[MAX];
    char cognome[MAX];
    char telefono[MAX];
    char mail[MAX];

    if (utenti == NULL) {
        printf("non ho caricato gli utenti");
    } else {
        while (!feof(utenti)) {    
            if (p != NULL) {
                punt = (struct elemento *)malloc(sizeof(struct elemento));

                fscanf(utenti, "%s", nome);
                puts(nome);
                fscanf(utenti, "%s", cognome);
                puts(cognome);
                fscanf(utenti, "%s", telefono);
                puts(telefono);
                fscanf(utenti, "%s", mail);
                puts(mail);

                strcpy(punt->nome, nome);
                strcpy(punt->cognome, cognome);
                strcpy(punt->telefono, telefono);
                strcpy(punt->mail, mail);

                punt->pun = p;
            } else if (p == NULL) {
                p = (struct elemento *)malloc(sizeof(struct elemento));
                fscanf(utenti, "%s", nome);
                fscanf(utenti, "%s", cognome);
                fscanf(utenti, "%s", telefono);
                fscanf(utenti, "%s", mail);

                strcpy(p->nome, nome);
                strcpy(p->cognome, cognome);
                strcpy(p->telefono, telefono);
                strcpy(p->mail, mail);

                p->pun = NULL;
                punt = p;
            }
        }
    }

    fflush(utenti);
    fclose(utenti);
    return(punt);
}




// SAVE THE LIST 
int salva(struct elemento *p) { 
    FILE *stream = fopen("miarubrica.txt", "w");

    while (p != NULL) { 
        // Scrive sul file
        fprintf(stream, "%s ", p->nome);
        fprintf(stream, "%s ", p->cognome);
        fprintf(stream, "%s ", p->mail);
        fprintf(stream, "%s \n", p->telefono);

        p = p->pun;
    } 

    fflush(stream);
    fclose(stream);

    return;
}

this write me (例)

pippo disney 02345432 pippodisney@pippodisney.com  

miarubrica.txtにあるのですが、リストを読むメソッドで読むと(うまくいきます)、わかります

pippo disney 02345432 pippodisney@pippodisney.com
pippo disney 02345432 pippodisney@pippodisney.com

シェルで2回。どうしたの?

4

2 に答える 2

2

では、先頭に追加する ( が指すエントリのに新しいエントリを配置する) か、追加する ( が指すエントリのcaricalistaに新しいエントリを配置する)かについて混乱しているようです。pp

たとえば、 isnpでない場合はdo を変更NULLせずpunt->pun = p;に残しpますが、次の反復では同じことを行います。

また、ファイルが空の場合は、初期化されていない状態で返されpuntます。

于 2012-07-13T17:13:19.433 に答える
2

これが簡単な修正です。「->駄洒落」ポインタを使ったものを混ぜました。あなたがそれを使用しないので、私は salva() メソッドを削除しました。

#include <stdio.h>
#include <malloc.h>

#define MAX (256)
struct elemento {
    char nome[MAX], cognome[MAX], telefono[MAX], mail[MAX];
    struct elemento* pun;
};

// LOAD THE LIST FROM THE FILE
struct elemento *caricalista(struct elemento *p) {
    struct elemento *punt = p;
    FILE * utenti = fopen ("miarubrica.txt","r");

    if(!utenti) { printf("non ho caricato gli utenti"); return p; }

    while(!feof(utenti)) {    
        punt= (struct elemento *)malloc(sizeof(struct elemento));

        fscanf(utenti,"%s%s%s%s", 
                punt->nome, punt->cognome, punt->telefono, punt->mail);

        printf("%s %s %s %s\n",   /* print new element */
            punt->nome, punt->cognome, punt->telefono, punt->mail);

        punt->pun = p; /* old list at the end */
        p = punt;   
    }

    fclose(utenti);
    return(punt);
}

int main() { caricalista(NULL); return 0; }
于 2012-07-13T17:19:43.577 に答える