从c中的文件中读取名称和密码

时间:2013-02-11 15:38:19

标签: c file

我正在尝试将文件中的名称和密码读入c中的结构,但显然我的代码无法按预期工作。有没有人可以帮我解决下面附带代码的问题?非常感谢! (基本上该文件有几个名称和密码,我想将它们读入结构帐户[]`)

#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

lol 123

世界123

3 个答案:

答案 0 :(得分:5)

您正在阅读文件两次。因此,在第二次循环开始之前,您需要fseek(), or rewind()到第一个字符。

尝试:

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

rewind(fp);             // s   

这个代码需要在两个循环之间添加(在第一次之后和第二次循环之前)

此外,您要在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

答案 1 :(得分:1)

您需要malloc()结构中指针的内容,或者使用静态大小声明:

struct account {
    char id[20]; 
    char password[20];
};

答案 2 :(得分:0)

你应该首先为你scanf的内容分配内存。关键字是malloc,有点太长了,无法在这里讲课。