2014-12-29 70 views
-5

對此,我問here如何對我的c文件進行排序,這是我創建的編碼響應。對C文件進行排序

#include <stdio.h> 
#include <conio.h> 

int main() 
{  
    FILE *fN; 
    FILE *fS; 

    fN=fopen("Numbers.txt","r"); 
    fS=fopen("Sorted.txt","w"); 
    system("sort Numbers.txt > Sorted.txt"); 
    getch(); 
    fclose(fS); 
    fclose(fN); 
} 

這總是想出了同樣的錯誤信息:因爲它正在被其他進程使用進程無法訪問文件。

這是否意味着我顯示更改庫?,我真的很困惑,爲什麼有一個錯誤。

+7

問題的標題有點讓人誤解,因爲它似乎是在嘗試對文件進行排序_using C_,而不是_sort C文件_。無論如何,我不明白你爲什麼使用'fopen'和'fclose',因爲'sort'命令將負責打開和關閉文件。 – Michael

+4

你在你的程序中打開它們,它阻止'sort'訪問'sorted.txt'。如果你不打算在你的程序中使用它們,你爲什麼要在程序中打開它們?你的主體的整個主體可能只是'system'的行。 –

+0

@KenWhite謝謝....雖然我猜這確實不是那麼明顯。 – WhipItOut

回答

2

您上面發佈的代碼基本上使用sort命令行實用程序進行排序。當你寫

system("sort Numbers.txt > Sorted.txt"); 

你在Numbers.txt文件調用sort,則該命令的輸出重定向到文件Sorted.txt

與您的代碼的問題是,你嘗試這樣做之前,你寫

fS=fopen("Sorted.txt","w"); 

這將打開Sorted.txt寫作,這在大多數操作系統將被任何其他進程寫入鎖定文件 - 包括您的sort流程。爲了解決這個問題,只是消除所有的fopenfclose調用和只寫

int main() { 
    system("sort Numbers.txt > Sorted.txt"); 
} 

公平地說,如果這就是你的程序確實,剛剛從在命令行中執行上面的命令。但是,如果您以子程序的形式執行此操作,則只需使用system命令,不要執行任何手動fopenfclose調用。

希望這有助於!

+0

啊,我沒有意識到它打開了函數內部的文件,謝謝。 – WhipItOut

0

假設該文件不是太大(例如至多幾個幾十兆,或者幾個GB的一個功能強大的桌面與16GBytes RAM上),因此它的內容適合在內存中,你可以逐行使用循環閱讀在getline(3)(或者fgets一些適當大的緩衝區),strdup(3)每個讀取線,並把它在某些動態分配(使用calloc(3)realloc(3))指針數組,然後使用上述strcmp(3)內置如果你想有一個比較函數調用該陣列上qsort(3)排序字符串。

如果你做到這一點如上所述,你不依賴於任何外部sort命令,這可能並不適用於所有系統。

如果該文件只包含數字,閱讀(每行或sscanfstrtollstrtod)使用fscanf(3),使自己的比較功能。

您的問題可能是在您的操作系統上,文件無法通過多個進程打開(大多數POSIX系統允許)。任一運行sort命令,或者避免由編碼運行的外部命令(這也是一個外部依賴性)正如我所說後fopenSorted.txt文件(讀取到一個數組,qsort荷蘭國際集團它)

如果浮動工作點the floating point guide(即每個程序員應該知道的浮點運算),並知道NaN s。

另請注意<conio.h>而不是標準標題:我的系統(Linux)沒有它。你也許並不需要它(你可能不需要調用getch

如果編碼C++ 11可以使用std::sort

如果使用SQLite或一些真正SQL數據庫(例如PostgreSQL。 ..)你可以有一個適當的數據庫模式併發出適當的SQL請求(與SELECT ... ORDER BY ....)。不要忘記適當的索引。

+0

這將工作的浮點數? – WhipItOut

+0

是的,因爲'qsort'的比較函數是用戶提供的。只要適合您的需求 –