2010-09-08 18 views
1

我遇到了一些問題,試圖運行這個程序,我正在努力......要求說我不被允許使用排序功能...我自己做了一些事情....等等。C程序合併文件未找到EOF,陷入無限循環!

好看多了,程序編譯,但執行掛起後......我猜它是停留在一個無限循環......但我似乎無法找到它... :(

這個程序讀取該會已經至少責令其最大的數據文件,將它們合併(有序)到第三個txt文件...

的兩個文件是DATA1.TXT和Data2.txt 包含:

數據1 .txt

2 
2 
2 
2 

Data2.txt

1 
3 
5 
7 
9 

combine.c

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


void sortData(FILE *fpData1, FILE *fpData2) 
{ 

int n, m; 
FILE *fpMerge; 


fpMerge = fopen("Merge.txt", "w+"); 


fscanf(fpData2, "%i", &n); 
fscanf(fpData1, "%i", &m); 
while(n != EOF || m != EOF) 
{ 

    if(n == EOF) 
    { 
    fscanf(fpData1, "%i", &m); 

    while(m != EOF) 
    { 

    fprintf(fpMerge, "%i\n", m); 
    fscanf(fpData1, "%i", &m); 
    } 
    } 
    if(m == EOF) 
    { 
    fscanf(fpData2, "%i", &n); 

    while(n != EOF) 
    { 

    fprintf(fpMerge, "%i\n", n); 
    fscanf(fpData2, "%i", &n); 
    } 

    } 

    if(n < m) 
    { 
    fprintf(fpMerge, "%i\n", n); 
    fscanf(fpData2, "%i", &n); 
    } 
    if(n > m) 
    { 
    fprintf(fpMerge, "%i\n", m); 
    fscanf(fpData1, "%i", &m); 
    } 
    if(n == m) 
    { 
    fprintf(fpMerge, "%i\n", n); 
    fprintf(fpMerge, "%i\n", m); 
    fscanf(fpData2, "%i", &n); 
    fscanf(fpData1, "%i", &m); 

    } 
} 

fclose(fpMerge); 
} 

int main (void) 
{ 
FILE *fpData1; 
FILE *fpData2; 


fpData1 = fopen("Data1.txt", "r"); 
if(fpData1 == NULL) 
{ 
    printf("There was an error opening the file...program terminating..\n"); 
    exit(1); 
} 

fpData2 = fopen("Data2.txt", "r"); 
if(fpData2 == NULL) 
{ 
    printf("There was an error opening the file...program terminating..\n"); 
    exit(1); 
} 



sortData(fpData1, fpData2); 


fclose(fpData1); 
fclose(fpData2); 

return 0; 
} 
+2

_「...我猜這是......」_你是否附加了一個調試器來查看你的程序在做什麼?您是否嘗試添加一些正確的調試輸出語句(使用'printf')來查看它出錯的位置? – 2010-09-08 05:43:52

+0

我添加了一些printf的,它似乎程序沒有在文件中移動...它停留在第一個數字,並永遠...有沒有更好的方法來移動指針...因爲我真的不知道...我之前用fscanf做過,我沒有看到我做錯了什麼.. – Bri 2010-09-08 06:07:29

回答

7

你不想比較n != EOF,而是fscanf返回值:

int count_1; 
count_1 = fscanf(fpData1, "%i", &m); 
if (count_1 == EOF) // EOF (or error) 
{ 
    // ... 
} 

fscanf也將錯誤返回EOF。如果需要分開告知EOF和錯誤條件,請使用ferror(fpData1),然後查找錯誤代碼(存儲在errno中)。

+0

我可以使用(!feof(filename))嗎?我正在用它開始...但我試着將它改爲!= EOF,看看它是否有所作爲...並且它沒有... – Bri 2010-09-08 05:59:54

+0

我的手冊頁沒有提到fscanf()'設置流eof標誌(一個'feof()'測試)。爲什麼不抓住返回值並測試它是否爲'EOF'? – 2010-09-08 06:10:54

+0

我想出了我的問題..我討厭我的循環,搞砸了檢查錯誤的EOF。無論如何感謝:) – Bri 2010-09-08 06:31:55

1

你EOF的檢測是不太正確的

void sortData(FILE *fpData1, FILE *fpData2) 
{ 
    int data1; 
    int data2; 
    FILE *fpMerge; 

    fpMerge = fopen("Merge.txt", "w+"); 
    fscanf(fpData1, "%i", &data1); 
    fscanf(fpData2, "%i", &data2); 

    // While one file still has data   
    while(!feof(fpData1) && !feof(fpData2)) 
    { 
     // Choose 1 file to test 
     // Read from that file and put into merge file until either we 
     // run out of data or the condition fails. 
     if(data1 < data2) 
     { 
      do {fprintf(fpMerge, "%i\n", data1);} 
      while ((fscanf(fpData1, "%i", &data1) != 0) && (data1 <= data2)); 
     } 
     else 
     { 
      do {fprintf(fpMerge, "%i\n", data2);} 
      while ((fscanf(fpData2, "%i", &data2) != 0) && (data2 <= data1)); 
     } 
     // NOTE: if fscanf() returns 0 it has failed to read (EOF) 
    } 
    // One of the files has reached the EOF 
    // Dump the other file. 
    while(fscanf(fpData1, "%i", &data1) != 0) {fprintf(fpMerge, "%i\n", data1);} 
    while(fscanf(fpData2, "%i", &data2) != 0) {fprintf(fpMerge, "%i\n", data2);} 
} 
1

EOF不是字符。
EOF不是整數。
沒有文件將會有EOF(既不char也不int)在他們。

EOF是一種病症。
文件將處於該狀態或(通常)不是。

您應該檢查返回值fscanf()以檢測EOF或其他問題。

+1

'EOF'是一個整數(或至少可以轉換爲一個):它由'int fscanf(FILE * stream,const char * format,...)'返回。我的'stdio.h'副本(來自eglibc,我認爲)'#define'EOF'爲-1。一個更好的說法是:「如果你將'fscanf()'變成一個變量,並檢查它與'EOF'的對應關係,那麼你不會做你認爲你正在做的事情,而是將從文件中讀取的值與任何你的'stdio.h'版本用來表示'EOF',這幾乎肯定不是你想要的。「 – 2010-09-10 00:04:15

+0

是的,我的文本有點太強大了。感謝您的更正。 – pmg 2010-09-10 06:37:56

+0

是啊......'EOF'是一個整數,'char unsigned'值是'int'的一個子集,與'f *'stdio函數'EOF'中唯一的條件值不相交。 – 2010-09-12 08:05:29