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

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 的代码。

以上是关于将文件中的数据保存到数组中的主要内容,如果未能解决你的问题,请参考以下文章

将数组保存到 JSON 文件,然后使用 Array.push() 将数据保存在其中

如何将 List<> 数组中的数据保存到文本文件(C#)?

将数据从文件加载到c中的数组

使用 Parse 数组将数据保存到设备

HDF5:将线性数组保存到三维数据集

matlab怎样按列读取txt中的数据到数组啊