将数据从文件保存到数组中

时间:2014-01-31 18:37:31

标签: c arrays file while-loop save

我正在尝试扫描此信息:

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循环但是我被困在那里。谢谢!

4 个答案:

答案 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"