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

标签 c file-io

我正在尝试从文本文件 (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/

相关文章:

C++ 覆盖文件中特定位置的数据

c - 如何指定目标文件的名称

c - 如何修复由于递归算法引起的段错误

c - C Union 中的 Endian 交换

c - qsort 没有对字符串数组进行排序

json - 如何在 swift 4 中从多个字典写入多个 JSON 对象

c - 从数组中添加/删除元素

java - 从 imageReader 写回修改后的图像

linux - 在 linux 中删除打开的文件时内部会发生什么

java - 是否可以同时读取和写入文件?