2013-04-21 79 views
0

我正在將文本文件重定向到我的C程序中,例如,輸入重定向和倒帶

./test.c < earthquakes.txt 

,我讀我需要一個scanf函數像這樣的數據:

while (scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f", 
    &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki, 
    &latit, &longi, &depth, &magnitude) == 13) { 
    printf("test\n"); 
    num_earthquakes++; 
} 

,直到我讀了我需要的所有線路。做完這些之後,我該如何倒退回stdin的開始?

+2

您通常不能倒回* stdin *;你想從''使用[rewind()函數](http://en.wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/rewind),但是你不應該指望它總是對'stdin ';在某些系統上它可能工作,但在大多數系統上它會失敗。你可能更喜歡使用'fseek',因爲它報告更好的失敗。 – 2013-04-21 15:00:33

+0

而不是在命令提示符下重定向'<'。我建議用戶'fscanf()'從文件讀取。 'rewind()'和'fseek()'是可用於將文件指針移回開始的兩個函數。 – 2013-04-21 15:00:59

+0

好,所以有100%沒有辦法讓我做我想找的東西嗎?只要確定。這是一個賦值,我們*有*使用輸入重定向,不涉及文件指針。我可能只需要閱讀一次。 – nebffa 2013-04-21 15:06:25

回答

1

也許一次傳遞是最好的選擇:讀取值並在必要時使用realloc調整陣列大小。爲了儘量減少大量輸入錯誤的機會,您只需要存儲所需的信息來解決您的問題。如果產出基於數月,則收集基於月份的信息。例如:

size_t count = 0; 
struct month_stat *month = NULL; 
while (count <= SIZE_MAX/sizeof *month && 
     scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f", 
      &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki, 
      &latit, &longi, &depth, &magnitude) == 13) 
{ 
    /* resize based upon powers of two for simplicity */ 
    if (count & (count - 1) == 0) 
    { 
     void *temp = realloc(month, (count * 2 + 1) * sizeof *month); 
     if (temp == NULL) 
     { 
      /* handle error */ 
     } 

     month = temp; 
    } 

    /* TODO: Update month[count] and overall stats 
    *  When the month changes, you'll want to count++; 
    */ 
} 

你知道,你可以告訴scanf函數通過將%和所使用的任何格式說明符之間的*丟棄輸入?例如,assert(scanf("%*c") == 0);會讀取並丟棄一個沒有賦值的字符,這反映了返回值。

+0

謝謝我希望有一個更簡單的版本,但我已經與realloc。我也不知道如何用scanf做到這一點 - 謝謝你的提示。該scanf行提供給我們,但我仍然使用你的建議^^ – nebffa 2013-04-22 14:13:52

2

stdin是一個流,而不是一個普通的文件,所以你不能只倒帶輸入。

所以我想,你應該使用文件的定期讀數,或者如果你想複製收到的數據到緩衝區,以便再次閱讀。

+0

你是什麼意思 - 將接收到的數據複製到緩衝區?什麼是「緩衝區」? – nebffa 2013-04-21 15:42:27

+0

@nebffa我的意思是一個臨時數組。但總的來說這並不好。我認爲,在你的情況最好的是使用文件。 – Alex 2013-04-21 18:43:37

0

一種可能的方法是在第一堂課期間在內存中構建一個表示。例如,你創建一個對應於每一行的鏈表,並且這個元素是你自己的結構。

這樣一來,一次又一次的閱讀,你有一個有趣和方便的方式來使用它們。