【问题标题】:Read from txt file with unknown numbers of int in C从 C 中具有未知数量 int 的 txt 文件中读取
【发布时间】:2013-12-10 16:35:40
【问题描述】:

我必须从 .txt 文件中读取“N”个整数并将每个整数放入数组 X[i] 但问题是,我不应该知道 txt 中有多少 int。该代码必须适用于遵循此模型的每个 txt

5 4
1 2 3
1 3 4
2 3 5
4 5 5

所以我有,在第一行,第二个数字(示例中为 4),txt 中的 int 数将为 N=4*3(4 行,3 个数字(总是第二个数字*3))+ 2(第一行)
我知道的唯一代码是当我知道有多少数字时,比如

    int t[14] // I know there are 14 numbers on the .txt
    while(fgets(buf, sizeof(buf), fp)) {

  int result = sscanf(buf, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d", &t[0], &t[1], &t[2], &t[3], &t[4], &t[5], &t[6],&t[7],&t[8],&t[9],&t[10], &t[11],&t[12],&t[13]);
  if (result <= 0) break;  // EOF, IO error, bad data

  for (r=0; r<result; r++) {
    if (i >= sizeof(X)/sizeof(X[0])) break;  // too many
    X[i++] = t[r]; //put them in the X[MAX]
  }
}  

而且我需要阅读每个数字,例如
2 3 5
我将 5 放入数组[2][3]
我该怎么做? 谁能给我举个例子??? 谢谢!

【问题讨论】:

  • 您需要动态地分配数组,可能使用malloc库调用。

标签: c arrays


【解决方案1】:

一个简单的模板:

int a, b, i;
int *N;
if(fscanf(fp, "%d%d", &a, &b) != 2) { /* Read the first 2 integers */
    /* Unable to read in 2 integers. Handle error... */
}
N = malloc(3 * b * sizeof(int)); /* Allocate enough space */
for(i = 0; i < 3*b; ++i) {
    if(fscanf(fp, "%d", &N[i]) != 1) { /* Read numbers one-by-one */
        /* Input may not be enough. Handle error... */
    }
}
/* Now you have (3*b) integers stored in N */
/* after operations completed... */
free(N);

没有必要逐行阅读和有多少数字。只需一次又一次地调用fscanf(),因为您的输入由空格字符和换行符分隔。

【讨论】:

  • 如果你在循环中演示if (fscanf(fp, "%d%d", &amp;a, &amp;b) != 2) { ...handle error... } 和类似的fscanf() 会更好。此外,对于第二个数字的合理大小,C99 将允许您使用 VLA(可变长度数组):int N[3 * b];。当然,C99 还允许您像 C++ 一样交错语句和声明。
  • @JonathanLeffler 已修改。谢谢你的建议。
  • 问题是我需要每个数字。就像 1 2 3 我将 3 放在垫子上[1][2]
  • 代码会读取每一个数字; scanf() 读取到数字的末尾,并留下不是数字的任何内容以进行下一次输入操作。循环将读取第一行末尾的换行符,然后读取第二行上的第一个数字直到空白,然后下一次迭代将跳过空白并读取行上的第二个数字直到第二个空白,并且等等等等。此代码不关心数字是否都在一行上,或者每行一个数字,或者连续数字之间是否有 20 个空白行。 [...继续...]
  • [...continuation...] 如果您必须进行面向行的 I/O,那么您使用 fgets() 一次读取一行并使用 @ 987654328@ 从每行读取三个数字:while (fgets(line, sizeof(line), fp) != 0) { if (sscanf(line, "%d%d%d", &amp;N[i], &amp;N[i+1], &amp;N[i+2]) != 3) { ...error... } else i += 3; } 或附近,记得检查数组溢出(数字说有 20 行但实际上有 40 行;如果你踩到了,检测 EOF 将无济于事边界)。
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2013-11-09
  • 1970-01-01
  • 2020-10-09
  • 2017-08-23
相关资源
最近更新 更多