我正在尝试扫描此信息:
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循环但是我被困在那里。谢谢!
答案 0 :(得分:1)
看来你假设fscanf
在失败时会返回0。这似乎不正确,请查看一些文档,例如here。在网页上搜索关键字return
。
事实证明你应该在fscanf没有返回-1
的情况下运行循环。这应该可以解决问题。
答案 1 :(得分:1)
问题在于:
fscanf(dataLogin, "%s:%s\n", username[i], password[i])
%s:%s不会在你想要的两个字符串中划分00abcabc:abc123。 在fscanf的手册页中,对于%s:“输入字符串在空格或最大字段宽度处停止,以先发生者为准。” 这意味着第一个%s将读取整行:00abcabc:abc123,第二个读取第二行等。 你需要找到另一种方法来划分两个字符串中的每一行。
编辑:Leonardo的回答确实是你的while循环没有终止的原因,但即使你修复它也会遇到这个问题
答案 2 :(得分:1)
//如果修复了输入文件(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");
}
答案 3 :(得分:0)
尝试:
while (fscanf(dataLogin, "%[^:]:%s\n", username[i], password[i]) == 2){i++;}
scanf返回红色的字段数,因此直到文件结尾才为2。您还需要将"%s:%s\n"
更改为"%[^:]:%s\n"
。