【问题标题】:how to read a text file in c and then split each line into tokens?如何在 c 中读取文本文件,然后将每一行拆分为标记?
【发布时间】:2015-05-06 12:13:05
【问题描述】:

输入文本文件每行有一些数字,数字用空格分隔。前两行只有一个数字,后面几行是三个。我想要做的是读取输入的每一行并存储这些数字。

这是我目前得到的:

    int
    main(int argc, char *argv[]) {
        int n = 0;
        char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64
        while (fgets(buff,MAX_STRING_LEN, stdin) != NULL) {
            char temp;
            if (n == 0) {
                sscanf(buff, "%s", &temp);
                int h_num = (int)temp;
            } else if (n == 1) {
                sscanf(buff, "%s", &temp);
                int s_num = (int)temp;
            } else {
                sscanf(buff, "%s", &temp);
                char *token;
                token = strtok(&temp, " ");
                int i = 0;
                int a,b,c;
                while (token != NULL) {
                    if (i == 0) {
                        a = (int)token;
                        token = strtok(NULL, " ");
                    } else if (i == 1) {
                        b = (int)token;
                        token = strtok(NULL, " ");
                    } else {
                        c = (int)token;
                        token = strtok(NULL, " ");
                    }
                    i++;
                }
            }
            n++;
        }
        return 0;
    }

我用来测试我的代码的打印语句是这样的:

    printf("%d\n",h_num);
    printf("%d\n%d\n%d\n",a,b,c);

我创建了一个这样的文本文件:

23
34
4 76 91

但输出不是我所期望的,它是我认为的指针的地址。 (我又被指针卡住了=() 有人可以帮我指出问题所在吗?欣赏它。

【问题讨论】:

  • 你为什么不用fscanf(fp, "%d",&num)
  • 使用正确的格式字符串对fscanf 进行三次调用就足够了。没有循环,没有strtok,没什么复杂的。
  • 您的代码有很多问题。 sscanf(buff, "%s", &temp); 尝试使用 a = (int)token; 等将字符串扫描到 char
  • @CoolGuy 似乎fscanf 要求一个 FILE 指针,那么我该如何使用它来操作每一行?
  • 您是否正在重定向来自文件的输入?如果是这样,请使用fscanf(stdin, "%d",&num)

标签: c string pointers stdin


【解决方案1】:

在你的代码中,我可以看到,

int h_num = (int)temp;

int s_num = (int)temp;

不,这不是您将 字母数字字符串 转换为 int 的方式。

您需要为此使用strtol()

那么,

sscanf(buff, "%s", &temp);

错了。 tempchar,你必须使用 %c

我对更好方法的建议:

  1. 使用fgets()从文件中读取一个完整的行
  2. 使用strtok() 标记输入,使用空格 () 作为<em>分隔符</em>,然后使用@ 将标记(如果不是NULL)转换为int 987654324@
  3. 继续直到返回的令牌为NULL

在这种情况下,您的代码将更加通用,因为不需要单独关心每一行中ints 的编号

【讨论】:

  • strtol() 为什么不atoi
  • @Eregrith strtol() 更健壮,可以区分有效的0 输入和错误情况。
  • 如果您预见到这种扩展以在未来识别更多令牌,更复杂一点(但更强大)的解决方案是 Flex 和 Bison。或类似的词法分析器/解析器。 Windows 版本也可用。 aquamentus.com/flex_bison.html
  • @SouravGhosh 我试图以这种方式使用sscanfsscanf(buff, "%d", &amp;h_num)。然后我做printf("%d",h_num)。但是当我编译它时,它说h_num 未声明。这有什么意义?
  • @LeaneLi 你已经在 if 块中声明了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2012-11-29
  • 1970-01-01
相关资源
最近更新 更多