最近一个同学在写个银行管理程序(C语言小项目),然后问我怎么从文件搜索帐户,给了方法后又不懂文件里面的密码怎么与输入的匹配。一般来说,高效的做法是用链表实现。用数组实现不是高效的方法,而且浪费空间。再者,对于账户类有个人信息集合的,一般用结构体,代码写起来也方便简单。
但是他却用数组来做,而且没有用结构体。对于这种情况下如何搜索帐户,如何验证密码呢? 我尝试了一下,发现不难解决。
解决这个问题的方法:用文件数据的排序定位来做。
第一步:文件信息读入
用fscanf 实现文件读出文件信息。
1 char a[20]; 2 3 FILE* fp; 4 fp = fopen("test.txt","rb"); 5 fscanf (fp, "%s", a); 6 fclose(fp);
fcanf读取数据,以空格为分割点。比如对于文件内容为“abc ABC”(双引号之内)的情况,用如下代码:
fscanf (fp, "%s", a); fscanf (fp, "%s", b);
得到字符数组a 为abc;字符数组b为 ABC;
若文件内容为“abcABC”(双引号之内)的情况,即abc和ABC之间没有空格隔开,用以上代码,得到的结果将是:
字符数组a 为abcABC;字符数组b 为乱码。
fscanf();还有一个特点,就是在一个程序里面是顺序读入的。
在此举个例子:
txt文件(每个数据一行)内容:
abc
ABC
ruby
然后执行下面的代码:
int main() { char a[20],b[20],c[20]; FILE* fp; fp = fopen("test.txt","rb"); fscanf(fp, "%s", a); //……此处省略n行代码 fscanf(fp, "%s",b); //……此处省略n行代码 fscanf(fp, "%s",c); fclose(fp); return 0; }
得到的结果是:
字符数组a为 abc,b为ABC,c为ruby;
第二步:搜索账号
账号搜索的方法是遍历文件数据,找到与输入匹配的账号就停止搜索。
用 while(fscanf(fp,"%s",a) > 0) 实现遍历文件数据。
作用是把文件内容一行一行读入赋值给字符数组a,然后再与输入的账号进行比较。
同时使用标记 flag 判断是否找到匹配的账号,以便后续处理各种不同情况。
代码如下:
char a[20]; char shuRu[20] = {'