2014-09-27 85 views
0

晚上的最後一個問題。我儘量不要發帖超過每次鬥爭哈哈...從C輸入文件中讀取特定短語

這個更簡單一點。

我有一個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 

非常感謝任何人的幫助。

+0

如果沒有指定的文件格式,您必須閱讀每一行,直到找到它。沒有比這更復雜的了。而不是「設置指針」和「然後讀取數字」,只需讀取整行,並從中提取您的數字,如果你得到一個匹配。 – 2014-09-27 00:41:04

+0

如果我得到一場比賽,我將如何閱讀每一行然後提取數字?這聽起來像fseek有點兒交易對嗎? – Darksider13 2014-09-27 00:49:50

+1

不,請使用'fgets()'獲取整行,然後使用'fscanf()'或'strtol()',或者沿着這些行獲取數字。如果你的文件總是遵循這種格式,並且你知道你的行以'BUY ITEM'開始,然後是空格,那麼你就會知道你的編號從字符串的第10個字符開始。 – 2014-09-27 00:51:07

回答

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; 
} 

在你的問題的樣本數據文件運行此,您可以:

[email protected]:~/src/sandbox$ ./extr 
Bought item 8 
Bought item 10 
Awarded item 7 
Bought item 1 
Bought item 3 
Awarded item 9 
Bought item 7 
[email protected]:~/src/sandbox$ 

附帶的基礎上,在你的問題的建議之一,你可能要檢查出的問題的答案"while(!feof(file))" is always wrong