【问题标题】:Reading specific phrases from input file in C从 C 中的输入文件中读取特定短语
【发布时间】:2014-09-27 00:24:56
【问题描述】:

今晚的最后一个问题。我尽量不要在每次斗争中发布超过一次哈哈...

这个比较简单。

我有一个 txt 文件,其中前 8 行中有一系列排列的数字。之后的每一行都是一个特定的短语,例如“BUY ITEM”或“AWARD ITEM”,后跟一个整数(有几个短语,但我只关心一个)。基本上我试图有一个 for 或 while 循环,我可以在其中检测文档中的短语,将指针设置为短语的末尾,然后 fscanf 短语右侧的整数。我遇到的唯一麻烦是将指针指向特定短语的末尾,然后读取数字。以及该短语在不同的行上重复的事实,我不希望一次获取所有值。

我相信我可以做一个简单的

while (!feof(//function for reading phrase)) {
      fscanf("%d", &value);
      //rest of function

就是这样。但是我已经尝试了 fseek 和 fget 并且没有任何东西能够真正帮助获得指向我需要它的位置的指针,而没有预设的去向位置。输入文件每次都会不同,所以我不能只告诉它向下 1024 个空格或类似的东西。只是不知道你会怎么做……

下面还有一个输入文件的例子。

75 75 908
10 10
18 23.10 10.09
70 5 15
8 100 20 28.99
30 40 50 60
4 6 8 8 5 5 5 6 7 10
10
BUY ITEM 8
BUY ITEM 10
AWARD ITEM 7
BUY ITEM 1
BUY ITEM 3
AWARD ITEM 9
BUY ITEM 7
RETURN ITEM 8

非常感谢任何人的帮助。

【问题讨论】:

  • 在没有指定文件格式的情况下,您必须阅读每一行直到找到它。没有比这更复杂的了。而不是“设置指针”和“然后读取数字”,只需读取整行,如果匹配则从中提取数字。
  • 如果我得到匹配,我将如何读取每一行然后提取数字?这听起来像是一笔 fseek 交易,对吧?
  • 不,使用fgets() 获取整行,然后使用fscanf()strtol() 或类似的东西来获取数字。例如,如果您的文件始终遵循这种格式,并且您知道您的行以 BUY ITEM 后跟一个空格开头,那么您就会知道您的号码从字符串的第 10 个字符开始。
  • 太棒了,非常感谢。

标签: c file-io scanf fseek phrases


【解决方案1】:

这是一种简单的方法,使用以下事实:在相关行中,如果您的文件遵循相同的格式,那么数字将始终出现在该行的相同字符中。这有点脆弱,最好让你的程序更健壮,例如处理任意数量的空格,但我将把它作为练习留给你:

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

#define MAX_LEN 100
#define BUY_LEN 9
#define AWARD_LEN 11

int main(void) {
    FILE * infile = fopen("file.dat", "r");
    if ( !infile ) {
        perror("couldn't open file");
        return EXIT_FAILURE;
    }

    char buffer[MAX_LEN];
    char * endptr;

    while ( fgets(buffer, MAX_LEN, infile) ) {
        if ( !strncmp(buffer, "BUY ITEM ", BUY_LEN ) ) {
            char * num_start = buffer + BUY_LEN;
            long item = strtol(num_start, &endptr, 0);

            if ( endptr == num_start ) {
                fprintf(stderr, "Badly formed input line: %s\n", buffer);
                return EXIT_FAILURE;
            }

            printf("Bought item %ld\n", item);
        }
        else if ( !strncmp(buffer, "AWARD ITEM ", AWARD_LEN) ) {
            char * num_start = buffer + AWARD_LEN;
            long item = strtol(num_start, &endptr, 0);

            if ( endptr == num_start ) {
                fprintf(stderr, "Badly formed input line: %s\n", buffer);
                return EXIT_FAILURE;
            }

            printf("Awarded item %ld\n", item);
        }
    }

    fclose(infile);
    return 0;
}

使用您问题中的示例数据文件运行此程序,您会得到:

paul@local:~/src/sandbox$ ./extr
Bought item 8
Bought item 10
Awarded item 7
Bought item 1
Bought item 3
Awarded item 9
Bought item 7
paul@local:~/src/sandbox$ 

顺便说一句,根据您问题中的一项建议,您可能想查看问题"while( !feof( file ) )" is always wrong 的答案。

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 2021-05-07
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2012-07-03
    相关资源
    最近更新 更多