我正试图将文件中的名称和密码读取到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, %sn",
accounts[0].id, accounts[0].password,
accounts[1].id, accounts[1].password);
return 0;
}
name_pass.txt文件是这样一个简单的文件(名称+密码):
你好1234
lol 123
world 123
您正在读取文件两次。因此,在第二个循环开始之前,您需要fseek()或reward()到第一个字符。
试用:
fseek(fp, 0, SEEK_SET); // same as rewind()
或
rewind(fp); // s
您需要在两个循环之间添加此代码(在第一个循环之后和第二个循环之前)
此外,您需要在account struct
:中为id, password filed
分配内存
struct account {
char *id;
char *password;
};
或者像@Adrián Ló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, %sn",
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
您需要malloc()
结构中指针的内容,或者用静态大小声明:
struct account {
char id[20];
char password[20];
};
你可能应该首先为你正在scanf
中的东西分配内存。关键字是malloc
,太长了,不能在这里讲课。