从C中的输入文件中读取特定短语

时间:2014-09-27 00:24:56

标签: c file-io scanf fseek phrases

当晚的最后一个问题。我试着不要每次奋斗不止一次哈哈......

这个更简单。

我有一个txt文件,在前8行中有一系列排列的数字。之后的每一行都是某个短语,如"购买项目"或者"奖励项目"后跟一个整数(有几个短语但我只关心一个)。基本上我尝试使用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

非常感谢任何人的帮助。

1 个答案:

答案 0 :(得分:0)

这是一种简单的方法,使用的问题是,如果您的文件采用相同的格式,则数字将始终显示在该行的相同字符中。这有点脆弱,例如,为了使你的程序更加健壮,以应对任意数量的空白,我会更好,但我会将其作为练习留给你:

#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的答案。