0

次のコードでは、バイナリ ファイルからデータを読み取り、それを動的配列に書き込もうとしています。
関数「getAnz」は、データセットの数を教えてくれるはずです。
関数「readRecs」では、バイナリ ファイルからデータを読み取り、動的配列 (zArr) に書き込みたいと考えています。
プログラムは、正しい数のデータセットを教えてくれます。うん。

ここでいくつか質問があります:
1. データを読み取って動的配列に書き込む方法の何が問題になっていますか?
2. main 関数から readRecs 関数に "zArr" を渡すにはどうすればよいですか?
3. ファイル内のデータセットの数を取得する別の簡単な方法はありますか?
ご協力いただきありがとうございます。

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

struct daten
{
    char name[20];
    int alter;
};

long getAnz(FILE *fp)
{
    struct daten ptr;
    long counter = 0;

    while(fread(&ptr, sizeof(struct daten), 1, fp))
    {
        counter++;
    }

    fclose(fp);

    return counter;
}

void foo(FILE *fp, struct daten *zArr[], long lAnz)
{
    long i = 0;

    for(i = 0;i < lAnz;i++)
    {
        if(i == 0)
        {
             zArr = malloc(sizeof(*zArr));
        }
        else
        {
            zArr = realloc(zArr,sizeof(*zArr)*(i+1));
        }   
    }

    fclose(fp);
}

int main(void)
{
    struct daten *zArr;
    long anz = 0, i = 0;

    FILE *fp = fopen("daten.bin", "rb");
    anz = getAnz(fp);
    printf("%ld\n", anz);
    foo(fp, &zArr, anz);

    for(i = 0; i<anz; i++)
    {
        printf("%s\t", zArr[i].name);
        printf("%d\n", zArr[i].alter);
    }

    return 0;
}
4

2 に答える 2

0

ここで私はそのような動的読み取りを行いました:

ssize_t mygetline(char **buffer, int fd){
        size_t bufportion = 16000, bufsz = bufportion, i = 0;
        free(*buffer); *buffer = NULL;
        char *ptr;
        char *buf;
        buf = malloc(bufsz);
        if(!buf){freeQS(); die(MEMERR);}
        ptr = buf;
        if(read(fd, ptr, 1) != 1){ free(buf); return -1; }
        do{
                if(*ptr == '\n' || *ptr == 0) break;
                ptr++;
                if(++i >= bufsz){
                        bufsz += bufportion;
                        buf = realloc(buf, bufsz);
                        if(!buf){freeQS(); die(MEMERR);}
                        ptr = &buf[i];
                }
        }while(read(fd, ptr, 1) == 1);
        *ptr = 0;
        if(ptr > buf && *(ptr-1) == '\r') *(ptr-1) = 0;
        *buffer = strdup(buf);
        free(buf);
        return strlen(*buffer);
}

上記のコードでは、配列にデータを入力する操作はありません。

于 2013-01-14T11:21:32.207 に答える
0

他の問題の中でも、ポインターzArrを値で渡してvoid foo(FILE *fp, struct daten *zArr[], long lAnz)いるため、その変更は関数内でスコープされます。foo が返されたときに変更を保持したい場合は、試してくださいvoid foo(FILE *fp, struct daten * &zArr, long lAnz)

于 2013-01-14T11:06:43.850 に答える