因此,基本上下面的代码需要用户先登录,然后在用户登录后会显示用户详细信息,如user.txt中存储的详细信息。之后,我不知道如何从文件中检索文件,然后将其作为数组返回,以便我可以更新,例如更改用户的名称,或通过获取数组索引删除用户详细信息
这是我的代码
#include <stdio.h>
#include <string.h>
typedef struct {
char fullname[30];
char dob [10];
int contactNo;
int postcode;
}userDetails;
int main ()
{
char username [15];
char pwd [20];
char user_pass [30];
char userfile [100];
FILE *user;
FILE *admin;
userDetails myUser;
admin = fopen ("admin.txt","r");
printf("Please enter your Username\n");
scanf("%s",username);
printf("Please enter your Password\n");
scanf("%s",pwd);
user_pass[strlen(username) + strlen(pwd) + 2];
sprintf(user_pass, "%s;%s", username, pwd);
while (fgets(userfile, 100, admin) != NULL) {
if (strcmp(userfile, user_pass) == 0) {
printf("Authentication as %s successful\n", username);
size_t nread; // Printing the user information
user = fopen("user.txt", "r");
printf("\nHere is the registered user:\n");
if (user) {
while ((nread = fread(myUser.fullname, 1, sizeof myUser.fullname, user)) > 0)
fwrite(myUser.fullname, 1, nread, stdout);
if (ferror(user)) {
}
fclose(user);
}
}
else{
printf("Please enter correct username and password\n");
}
}
}
然后在user.txt中说文件以这样的格式存储
约翰; 1990年12月12日; 6017012682; 57115
保罗; 1221年12月12日; 60190002122; 100022
MAX;一九九○年十二月十一日; 60198454430; 900000
杰米; 2000年12月5日; 60190001231; 18000
谢谢
答案 0 :(得分:0)
如何从文件中读取数据并将其存储到数组中,然后读取要编辑的数组中的特定存储数据?
存储数据的步骤:
1) - 声明支持您的概念所需的存储变量类型。结构数组也许。
2) - 打开文件(FILE *fp = fopen("file path", "r");
)
3) - 循环fgets()
以读取文件的每一行(记录)
4) - 解析行,可能使用strtok并将每行的元素放入上面创建的存储变量中。
5) - 关闭文件(fclose(fp);
)
获取记录部分可以通过选择记录并返回由原始记录的每个字段组成的重新连接的字符串来完成。原型可能如下所示:
void GetRecord(RECORD *pRec, int rec, char *recordStr);
将存储创建为struct数组,结构将容纳您引用的4个字段,例如:
John; 12/12/1990; +6017012682; 57115 //带4个字段的示例记录
#define MAX_RECORDS 10 //arbitrary value, change as needed
typdef struct {
char name[260];
char date[11];
char num1;
char num2;
} RECORD;
RECORD record[MAX_RECORDS];//change size to what you need, 10 is arbitrary for illustration
代码示例 将数据读入记录并检索记录,如下所示:
( 仅示例 ,非常少的错误检查)
void GetRecord(RECORD *pRec, int rec, char *record);
int main(void)
{
FILE *fp = {0};
char recStr[260];
char *buf;
char line[260];
int i;
char strArray[3][7];//simple array, 3 string of 7 char each (enough for NULL terminator)
i = -1;
fp = fopen ("admin.txt", "r");
if(fp)
{
while (fgets (line, 260, fp))//will continue to loop as long as there is a new line
{
i++;
if(i >= MAX_RECORDS) break;//reached maximum records defined, time to leave
buf = strtok(line, ";");
if(buf)
{
strcpy(record[i].name, buf);
buf = strtok(NULL, ";");
if(buf)
{
strcpy(record[i].date, buf);
buf = strtok(NULL, ";");
if(buf)
{
record[i].num1 = atoi(buf);
buf = strtok(NULL, ";");
if(buf)
{
record[i].num2 = atoi(buf);
}
}
}
}
}
}
fclose(fp);
// 2nd argument valid values range from 1 - n (not 0 - n)
GetRecord(record, 3, recStr); //read third record into string "rec"
return 0;
}
void GetRecord(RECORD *pRec, int rec, char *record)
{
int r = rec - 1;//adjust for zero indexed arrays
if((r >= MAX_RECORDS) || (r < 0))
{
strcpy(record, "index error");
return;
}
sprintf(record, "%s;%s;%d;%d", pRec[r].name, pRec[r].date, pRec[r].num1, pRec[r].num2);
}
注意: &#34; coz [你是]匆忙而且只是复制代码,并意外删除了重要的事情&#34; ,
我没有 严格遵守您的变量名称。调整我所做的工作以满足您的需求。
输入文件的结果如下所示: