我正在尝试将文件中的名称和密码读入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
答案 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
,有点太长了,无法在这里讲课。