【问题标题】: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 个字符串才会成功。

标签: c arrays file while-loop save


【解决方案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 的代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 2015-05-30
        • 1970-01-01
        • 2015-12-11
        • 2022-06-30
        • 1970-01-01
        • 2021-08-18
        相关资源
        最近更新 更多