将文件中的数据保存到数组中
Posted
技术标签:
【中文标题】将文件中的数据保存到数组中【英文标题】:Saving data from a file into arrays 【发布时间】:2014-01-31 18:37:31 【问题描述】:我正在尝试扫描以下信息:
00abcabc:abc123
01defdef:def456
02hijhij:hij789
使用此代码分成两个数组:
FILE *dataLogin;
int i=0, numRecords;
char username[100][10], password[100][10];
dataLogin = fopen("login.dat", "r");
if (dataLogin == NULL)printf("Error");
else
while (fscanf(dataLogin, "%s:%s\n", username[i], password[i]))i++;
fclose(dataLogin);
numRecords = i;
for(i = 0; i < numRecords; i++)printf("%s, %s\n", username[i], password[i]);
printf("complete");
程序编译并运行,但不显示任何内容。我相信我已将故障隔离到 while 循环,但我被困在那里。谢谢!
【问题讨论】:
尝试检查来自fscanf
的返回
@Dmitri 如何解决这个问题?
更改您的 while
条件以验证它是否返回 2,例如。 (fscanf(...) == 2)
而不仅仅是 (fscanf(...))
。只有读取 2 个字符串才会成功。
【参考方案1】:
您似乎假设fscanf
将在失败时返回 0。这似乎是不正确的,请检查一些文档,例如 here。在网页上搜索关键字return
。
事实证明,您应该在 fscanf 不返回 -1
时运行循环。这应该可以解决问题。
【讨论】:
【参考方案2】:问题出在:
fscanf(dataLogin, "%s:%s\n", username[i], password[i])
%s:%s 不会将 00abcabc:abc123 分成你想要的两个字符串。 从 fscanf 的手册页中,对于 %s:“输入字符串在空白处或最大字段宽度处停止,以先发生者为准。” 这意味着第一个 %s 将读取整行:00abcabc:abc123,第二个将读取第二行,依此类推。 您需要找到另一种方法将每行分成两个字符串。
编辑:Leonardo 的回答确实是你的 while 循环没有终止的原因,但是即使你修复它,你也会在这里遇到这个问题
【讨论】:
【参考方案3】://如果固定输入文件(A:B) 中的第一部分(A) 的长度为8,第二部分(B) 的长度为7,那么您可以使用以下更改后的代码。使用 feof() 也可以解决检测文件结尾的问题..
#include <stdio.h>
int main()
FILE *dataLogin;
char ch;
int i=0, numRecords;
char username[100][10]='\0', password[100][10]='\0';
dataLogin = fopen("login.dat", "r");
if (dataLogin == NULL)
printf("Error");
else
while (!feof(dataLogin))fscanf(dataLogin, "%8s:%7s", username[i], password[i]);i++;
fclose(dataLogin);
numRecords = i;
for(i = 0; i < numRecords; i++)
printf("%s, %s\n", username[i], password[i]);
printf("complete");
【讨论】:
【参考方案4】:尝试:
while (fscanf(dataLogin, "%[^:]:%s\n", username[i], password[i]) == 2)i++;
scanf 返回红色字段的编号,因此在文件末尾之前它将为 2。而且你还需要把"%s:%s\n"
改成"%[^:]:%s\n"
。
【讨论】:
谢谢大家!我最终使用了来自@fede1024 的代码。以上是关于将文件中的数据保存到数组中的主要内容,如果未能解决你的问题,请参考以下文章