2015-10-13 38 views
0

我有一個文本文件,如下所示:直到一個換行符打

12345678909876543211234567890 
09876543122345678900 

我最終將需要使用單獨的堆棧,以這兩個值加在一起,所以要推每一個數字到堆棧分開,所以我有這樣的代碼如下:

test=fopen("test.txt","r"); 
while (!feof(fp)) { 
    fscanf(test, "%1d", &number); 
    Push((Item)number, &num1); 
} 

我需要,但這樣它一次讀取的第一行1位,推動每個數字,然後下一行修改我的代碼我需要它推入另一個名爲num2的堆棧,而不是正如您在當前代碼中看到的那樣。

+0

@ user3121023不會掃描他們作爲字符雖然? – ComputerLocus

+1

讀取一行數據;將數字推入堆棧。閱讀下一行;將數字推到另一個堆棧上。使用標準C函數['fgets()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html)或POSIX函數['getline()'](http:// pubs .opengroup.org/onlinepubs/9699919799/functions/getline.html)來讀取這些行。 –

+0

另請參見[爲什麼'while(!feof(file))'總是錯?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) –

回答

3

你沒有告訴我們關於棧的類型,所以我發明了一個 - typedef名稱是Stack

Stack num1, num2; 
Stack *stacks[2] = { &num1, &num2 }; 

…initialize stacks 
…open file and check that the open was successful 

for (int i = 0; i < 2; i++) 
{ 
    char line[4096]; 
    if (fgets(line, sizeof(line), test) == 0) 
     …report unexpected EOF or other error; do not continue… 
    char *digit = line; 
    while (isdigit((unsigned char)*digit)) 
     Push((Item)(*digit++ - '0'), stacks[i]); 
    if (*digit != '\n' && *digit != '\0') 
     …report unexpected (non-digit) data on input; do not continue; 
} 

我認爲Push是一個函數,而不是可能評估其第一宏不止一次的爭論。如果它是這樣一個宏,循環體需要分成兩行並加上大括號,使得digit的增量與函數調用分開。

請注意,這種方法的一個主要優點是,您擁有可用於錯誤報告的整行數據,對於人們而言,這通常比僅能夠報告半數之後遺留的點滴和點綴更易於理解 - 通過scanf()循環從行中讀取不確定的字符數。你甚至可以使用sscanf()上線,如果你想 - 看到How to use sscanf() in loops?

相關問題