2015-06-25 42 views
1

我想創建一個包含50行text.txt文件的C程序。這個text.txt文件應該被分成5個文件,比如text_part1.txt,text_part2.txt等等。 text.txt文件中的50行應該同樣複製到5個文件中的每行10行。使用命令行參數在C程序中創建多個文件

所有這些都必須通過使用命令行參數來完成。我是C初學者,剛剛開始編寫代碼。我不知道如何使用命令行參數。

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

int main() 
{ 
FILE *ptr_readfile; 
FILE *ptr_writefile; 
char line [100]; 
char fileoutputname[10]; 
int filecounter=1, linecounter=1; 

ptr_readfile = fopen("C:/home/dir/sample_pg/data/text.txt","r"); 
if (!ptr_readfile) 
return 1; 

sprintf(fileoutputname, "file_part%d", filecounter); 
ptr_writefile = fopen(fileoutputname, "w"); 

while (fgets(line, sizeof line, ptr_readfile)!=NULL) 
{ 
    if (linecounter == 5) 
     { 
     fclose(ptr_writefile); 
     linecounter = 1; 
     filecounter++; 
     sprintf(fileoutputname, "file_part%d", filecounter); 
     ptr_writefile = fopen(fileoutputname, "w"); 
     if (!ptr_writefile) 
      return 1; 
     } 
    fprintf(ptr_writefile,"%s\n", line); 
    linecounter++; 
} 
fclose(ptr_readfile); 
return 0; 
} 
+0

這[鏈接](http://www.tutorialspoint.com/cprogramming/c_command_line_arguments.htm)是第一個出現在谷歌搜索。 –

+0

好吧... Thnaks爲您的時間,立即回覆。請告訴我,創建多個文件的代碼是否正確,因爲我沒有在指定路徑中找到任何文本文件 – Yogarajan

+0

您需要**編譯所有警告和調試信息**(例如'gcc -Wall -Wextra -g' if使用[GCC](http://gcc.gnu.org/)....)然後學習如何使用調試器** –

回答

3

要獲得程序的參數,你需要用一個參數的數量(通常稱爲argc)和和參數數組(通常命名爲argv),這樣的東西定義main功能

int main(int argc, char**argv) { 
    for (int ix=1; ix<argc; ix++) { 
    FILE* fil = fopen(argv[ix], "r"); 
    if (!fil) { perror(argv[ix]); exit(EXIT_FAILURE); }; 

當您將此代碼(以及其他所需的代碼)編譯爲可執行文件foo.exe並在終端上運行foo.exe a b cargc爲4,並且您有

 argc == 4 && 
     strcmp(argv[0], "foo.exe") == 0 && 
     strcmp(argv[1], "a") == 0 && 
     strcmp(argv[2], "b") == 0 && 
     strcmp(argv[3], "c") == 0 && 
     argv[4] == NULL 

請注意,這是一個好習慣叫perror上的功能的衰竭像fopen

順便說一句,你忘了打電話給fclose在你的程序。你也可以瞭解更多關於fflush。你應該更喜歡snprintfsprintf以避免buffer overflows。瞭解更多,並非常害怕,undefined behavior

請採取編譯所有警告的習慣&調試信息(例如gcc -Wall -Wextra -g如果使用GCC ....)然後學習如何使用調試器。

閱讀perror(3)fopen(3)fclose(3)fflush(3)snprintf(3)並採取習慣閱讀您要使用的每個功能的documentation

另請參閱csplit;您可以通過研究在Linux上實現它的free softwarecoreutils的源代碼來獲取靈感。

+0

感謝所有回答我的人的努力,我已經完成了我的計劃... – Yogarajan

相關問題