1

名前とパスワードをファイルから C の構造体に読み込もうとしていますが、明らかに私のコードは期待どおりに動作しません。以下に添付されているコードの問題を解決するのを手伝ってくれる人はいますか? どうもありがとう!(基本的に、ファイルにはいくつかの名前とパスワードがあり、それらを構造 accounts[]` に読み込みたい)

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

struct account {
    char *id; 
    char *password;
};

static struct account accounts[10];

void read_file(struct account accounts[])
{
    FILE *fp;
    int i=0;   // count how many lines are in the file
    int c;
    fp=fopen("name_pass.txt", "r");
    while(!feof(fp)) {
        c=fgetc(fp);
        if(c=='\n')
            ++i;
    }
    int j=0;
    // read each line and put into accounts
    while(j!=i-1) {
        fscanf(fp, "%s %s", accounts[j].id, accounts[j].password);
        ++j;
    }
}

int main()
{
    read_file(accounts);
    // check if it works or not
    printf("%s, %s, %s, %s\n",
        accounts[0].id, accounts[0].password,
        accounts[1].id, accounts[1].password);
    return 0;
}

name_pass.txt ファイルは、次のような単純なファイルです (名前 + パスワード):

こんにちは 1234

笑 123

世界 123

4

3 に答える 3

5

ファイルを2回読み取っています。したがって、 2番目のループが開始する前に、最初の文字にfseek()またはrewind()する必要があります。

試してみてください:

fseek(fp, 0, SEEK_SET); // same as rewind()   

また

rewind(fp);             // s   

このコードは、2つのループの間に追加する必要があります(最初のループの後と2番目のループの前)

id, password filedさらに、次の場所にメモリを割り当てる必要がありますaccount struct

struct account {
    char *id; 
    char *password;
};

または、@AdriánLópezが彼の回答で示唆したように、静的にメモリを割り当てます。

編集 私はあなたのコードを修正しました:

struct account {
    char id[20]; 
    char password[20];
};
static struct account accounts[10];
void read_file(struct account accounts[])
{
    FILE *fp;
    int i=0;   // count how many lines are in the file
    int c;
    fp=fopen("name_pass.txt", "r");
    while(!feof(fp)) {
        c=fgetc(fp);
        if(c=='\n')
            ++i;
    }
    int j=0;
    rewind(fp);  // Line I added
        // read each line and put into accounts
    while(j!=i-1) {
        fscanf(fp, "%s %s", accounts[j].id, accounts[j].password);
        ++j;
    }
}
int main()
{
    read_file(accounts);
    // check if it works or not
    printf("%s, %s, %s, %s\n",
        accounts[0].id, accounts[0].password,
        accounts[1].id, accounts[1].password);
    return 0;
}   

そしてその動作は次のとおりです。

:~$ cat name_pass.txt 
hello 1234

lol 123

world 123
:~$ ./a.out 
hello, 1234, lol, 123
于 2013-02-11T15:40:51.317 に答える
1

malloc()構造体のポインタの内容を確認するか、静的サイズで宣言する必要があります。

struct account {
    char id[20]; 
    char password[20];
};
于 2013-02-11T15:41:00.017 に答える
0

おそらく、最初に作業中のものにメモリを割り当てる必要がありますscanf。キーワードはmalloc、ここで講義するには少し長すぎます。

于 2013-02-11T15:40:58.597 に答える