gpt4 book ai didi

c - 如何从文件中读入3个输入值并按顺序读取它们?

转载 作者:行者123 更新时间:2023-11-30 14:40:05 25 4
gpt4 key购买 nike

我正在尝试从文本文件 (in.txt) 的第一行读取三个 3 值。我怎样才能在 C 中实现这个?

文本文件的第一行有 3 个数字(N、S、D)。它们代表文件中输入单词的序列。例如我的 in.txt 文件将是:

8 3 5
mary
tom
jane
joe
dave
judy
fred
bill
jane
jones
judy
mary
judy
fred
joe
dave

因此,第一个 8 将对应于 N,接下来的 3 对应于 S,最后一个 >5D。这样做的目的是我将第一个 8 添加到二叉搜索树中,然后按照 3 在 BST 中搜索,最后一个 5 code> 从 BST 中删除。

但对于这一点,我想知道的是如何从文件中读取它们以开始我的 BST。

我还没有走得太远,我只能打开该文件,但由于它根本不起作用,所以不得不删除其他代码。这就是我现在所拥有的一切。

int main()
{
FILE *inFile, *outFile;
int n, s, d;

inFile = fopen("in.txt", "r");

while(!feof (inFile))
{
fscanf(inFile, "%d %d %d", &n, &s, &d);
}
fclose(inFile);
}

这是我在 Stackoverflow 上的第一篇文章,非常感谢任何帮助!

最佳答案

首先,您需要查看 Why is while ( !feof (file) ) always wrong?

从文件中读取数据行时,请使用面向行的输入函数,例如 fgets() 或 POSIX getline()将整行读入缓冲区——然后从缓冲区中解析所需的值。这提供了两个主要好处:

  1. 您可以独立验证:

    a.从文件中读取数据;和

    b.解析该行中的值。

  2. 输入缓冲区中保留的内容并不取决于所使用的 scanf 格式说明符。 (始终会消耗整行,因此您随时准备从下一行的开头读取下一个输入)

每当您从文件中读取数据时,只需在使用 fgets 时提供足够大小的缓冲区(不要吝惜缓冲区大小!)。 POSIX getline 将自动分配所需的空间。然后使用 sscanf 解析该行所需的任何信息(或 strtok 或 strsep 或您喜欢定位特定点的任何其他函数)缓冲区内)。

如果您不解析信息并且需要整行,只需用nul-character覆盖它,从缓冲区末尾修剪'\n'strcspn提供了一个简单的方法,或者使用strlen获取长度然后覆盖最后一个字符。

在你的情况下,你只需要以不同于其余行的方式处理第一行——所以在开始时将行计数器初始化为零。如果您的行计数器为零,则从该行解析 3 个整数值,否则对后续行执行您需要的任何操作(下面它们只是与行号一起输出)

总而言之,你可以做类似的事情:

#include <stdio.h>
#include <string.h>

#define MAXC 1024 /* don't skimp on buffer size */

int main (int argc, char **argv) {

char buf[MAXC]; /* buffer to hold each line */
int n, s, d; /* your int variables */
size_t ndx = 0; /* line counter */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}

while (fgets (buf, MAXC, fp)) { /* read each line into buf */
if (!ndx) { /* if 1st line, parse into n, s, d */
if (sscanf (buf, "%d %d %d", &n, &s, &d) == 3)
printf ("line[%2zu] - n: %d s: %d d: %d\n",
ndx + 1, n, s, d);
else { /* if parse fails - handle error */
fputs ("error: invalid format - line 1.\n", stderr);
return 1;
}
}
else { /* for all subsequent lines */
buf[strcspn(buf, "\r\n")] = 0; /* trim '\n' from buf */
printf ("line[%2zu] : %s\n", ndx + 1, buf);
}
ndx++; /* increment line counter */
}
if (fp != stdin) fclose (fp); /* close file if not stdin */

return 0;
}

示例使用/输出

使用您的输入文件,您将得到以下内容:

$ ./bin/rdline1_3int dat/line1_3int.txt
line[ 1] - n: 8 s: 3 d: 5
line[ 2] : mary
line[ 3] : tom
line[ 4] : jane
line[ 5] : joe
line[ 6] : dave
line[ 7] : judy
line[ 8] : fred
line[ 9] : bill
line[10] : jane
line[11] : jones
line[12] : judy
line[13] : mary
line[14] : judy
line[15] : fred
line[16] : joe
line[17] : dave

关于c - 如何从文件中读入3个输入值并按顺序读取它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com