2012-07-18 90 views
0

嘗試使用當前的C I/O。我有一個文件,該文件只保存整數且有每行只有一個..不是逗號,等..什麼是閱讀的最佳途徑:C:I/O - 從文件中讀取int的最快/最佳方式

我創建2個文件,這是工作的罰款。但最終,我想將它們都讀入,並將它們合併到一個集合中,對它們進行排序,然後將它們打印到一個新文件中。有沒有必要爲你做的一切,對我來說,但請上述幫助..這是我的努力迄今:

void simpleCopyInputToOutput(void); 
void getSortSave(void); 

int main() 
{ 
    //simpleCopyInputToOutput(); 
    getSortSave(); 

    system("PAUSE"); 
    return 0; 
} 

void getSortSave(void) 
{ 
    FILE *fp1; 
    FILE *fp2; 
    FILE *fpMerged; 

    printf("Welcome. You need to input 2 sets of numbers.\n"); 
    printf("Please input the first sequence. Press 0 to stop.\n"); 

    if ((fp1 = fopen("C:\\seq1.txt", "w")) == NULL) 
    { 
     printf("Cannot open or create first file!\n"); 
     exit(1); 
    } 

    int num; 
    int i = 1; 
    while (num != 0) 
    { 
     printf("Please input value # %d\n", i); 
     scanf("%d", &num); 

     if (num == 0) 
     { 
      break; 
     } 

     fprintf(fp1, "%d\n", num); 
     i++; 
    } 

    printf("Please input the second sequence. Press 0 to stop.\n"); 
    if ((fp2 = fopen("C:\\seq2.txt", "w")) == NULL) 
    { 
     printf("Cannot open or create second file!\n"); 
     exit(1); 
    } 

    num = -1; 
    i = 1; 
    while (num != 0) 
    { 
     printf("Please input value # %d\n", i); 
     scanf("%d", &num); 

     if (num == 0) 
     { 
      break; 
     } 

     fprintf(fp2, "%d\n", num); 
     i++; 
    } 

    fclose(fp1); 
    fclose(fp2); 

    if ((fp1 = fopen("C:\\seq1.txt", "r")) == NULL) 
    { 
     printf("Cannot open first file!\n"); 
     exit(1); 
    } 

    //WHILE NOT EOF 
    // Read a number 
    // Add to collection 

    //TODO: merge ints from both files, sort and output to new file 
} 
+0

你試過'fscanf()'嗎? – YePhIcK 2012-07-18 08:44:30

+0

我可能會使用fscanf(「%d」,#)..類似的東西..但我想我真的想知道是否要搬到下一行..請別人給我我需要的while循環與EOF檢查或任何正確的方式來做到這一點在舊式的C ..我猜你只需要給我一個3或4班輪.. :) – Matt 2012-07-18 08:46:30

回答

1

我會建議你使用fgets

char buffer[16]; 
while (fgets(buffer, sizeof(buffer), fp1)) 
{ 
    long value = strtol(buffer, NULL, 10); 

    /* Use the value... */ 
} 

/* fgets failed ro read, check why */ 
if (!feof(fp1)) 
    printf("Error: %s\n", strerror(errno)); 

編輯:如何獲取文件中的條目數量:如果不以任何其他方式跟蹤它(例如,將條目數量作爲第一行),唯一的解決方案可能是將文件讀取兩次。一次來計算行數,一次來讀取實際的數字。計數後使用fseekrewind將讀指針「倒回」到文件的開頭。

我會親自把計數放在一個單獨的函數中,也是實際的讀數。這樣,如果你想從多個文件中讀取,你不必重複代碼。

+0

這似乎很好,謝謝。但問題的一部分也是..如何使一個未知長度的int數組?在C#中,我只是使用一個列表或類似的東西..在這種情況下,我在這裏做什麼?你會被標記爲答案,謝謝..但請幫助這部分太..因爲它是相關的.. – Matt 2012-07-18 08:59:16

+0

非常感謝! – Matt 2012-07-18 09:03:52

+0

@Matt用一種方法來計算文件中的行數,從而更新了我的答案。 – 2012-07-18 09:04:31

1

您的問題可以分爲三個不同的部分:讀取兩個文件,排序數據,並將輸出寫入文件。我在這裏假設這兩個輸入文件尚未排序。如果是的話,這個問題將會大大簡化(如果是這種情況,google for mergesort)。

如果要打開文件進行閱讀,則必須使用"r"而不是"w"作爲文件打開模式標誌。在你的示例代碼中,讀/寫部分與上面描述的相反。然後,您應該使用fscanf從FILE *中讀取格式化的輸入。 scanf(...)只是fscanf(stdin, ...)的簡稱。您可以訪問這些文件以下列方式:

FILE *fin1 = fopen("seq1.txt", "r"); 
FILE *fin2 = fopen("seq2.txt", "r"); 
FILE *fout = fopen("out.txt", "w"); 

if (fin1 && fin2 && fout) { 
    // Do whatever needs to be done with the files. 
} 
if (fout) 
    fclose(fout); 
if (fin2) 
    fclose(fin2); 
if (fin1) 
    fclose(fin1); 

使用動態內存來存儲整數是困難的。當你寫入越來越多的數據時,你需要使用realloc來增長緩衝區,最後使用qsort對數據進行排序。如果需要,其他人可以希望更深入地瞭解這一點。

+0

欣賞信息。謝謝。 – Matt 2012-07-18 13:37:35

相關問題