簡體   English   中英

C:讀入多個文件

[英]C: read in more than one file

大家好,使用POSIX API系統調用readwriteopen等。我可以打開,讀取,寫入文件並將其內容復制到輸出文件。 我將如何僅使用相關的系統調用將多個文件復制到輸出文件?

我目前有:

filein = open(argv[1],O_RDONLY,0);

打開一個文件。(這是argv1,但我想知道如何做argv2和argv3等。)

我試過了 :

j=0;
filein = open(argv[j],O_RDONLY,0);

但這會將argv0的​​內容打印到我的輸出文件中。

我被困在下一階段要做多個文件。 (我也有一個EOF循環,因此在1個文件退出后,我將如何繼續執行下一個文件)。

請您協助我進入下一階段? 謝謝。

背景

argv[0]是程序的名稱。

argv[1]是第1命令行參數。

argv[2]第二個命令行參數。

等等

所以:

  1. 1而不是0開始循環(即j=0不正確)。
  2. 確保在讀取文件之后和打開下一個文件之前立即關閉文件。

算法

在編寫代碼之前,請先考慮一下算法。

  1. 將counter設置為第一個參數的索引。
  2. 打開文件。
  3. 為打開的文件分配一個句柄。
  4. 讀取文件內容。
  5. 寫入(如果需要)文件內容。
  6. 使用手柄關閉文件。
  7. 遞增計數器。
  8. 循環播放,直到沒有更多命令行參數為止。

現在您可以編寫代碼了。

如果您包含錯誤處理,則可能會獲得積分。 (當文件丟失,不可讀,文件系統損壞或計算機內存或磁盤空間不足時會發生什么?)

串聯文件

如果要將兩個文件名串聯在一起,則需要重新考慮算法以及所需的內容。 “讀取命令行上給出的前兩個文件並將它們寫入第三個文件”與“將命令行上給出的所有文件追加到給出的最后一個文件”之間是有區別的。

讀二,寫一

算法:

  1. 確保恰好有三個參數。
  2. 為第三個文件(輸出)創建文件句柄變量。
  3. 為第一個文件(輸入)創建文件句柄變量。
  4. 為第二個文件(輸入)創建文件句柄變量。
  5. 打開第一個文件進行讀取。
  6. 打開第二個文件進行讀取。
  7. 打開第三個文件進行寫入。
  8. 讀取第一個文件的內容並將它們寫入第三個文件。
  9. 讀取第二個文件的內容,並將它們寫入第三個文件。
  10. 關閉第三個文件。
  11. 關閉第二個文件。
  12. 關閉第一個文件。

此時,您會發現很多冗余。

讀N,寫一個

該算法更具挑戰性,但消除了冗余。

  1. 確保至少有兩個參數。
  2. 打開最后一個文件進行寫入。
  3. 循環遍歷每個文件名,直到(但不包括)給定的最后一個文件名:
    1. 打開輸入文件進行讀取。
    2. 將文件內容寫入最后一個文件。
    3. 關閉輸入文件。
  4. 關閉輸出文件。

為此,您需要了解argc及其與argv關系。 用偽代碼:

if number_of_arguments < 2 then
  print "This program concatenates files; two or more file names are required."
  exit
end

int outfile = open arguments[ number_of_arguments ] for writing
int j = 1

while j < number_of_arguments do
  int infile = open arguments[ j ] for reading
  string contents = read infile
  write contents to outfile
  close infile
  increment j
end

close outfile

講解

如果您在使用C語法時遇到問題,請搜索教程。 例如:

使用循環讀取所有文件。 從1開始,跳過位於argv [0]的當前執行進程。

for(int i = 1; i < argc; ++i)
{
    int filein = open(argv[i],O_RDONLY,0);
    // ... process file
    close(filein)
}

argv [0]是程序的名稱。 argv [1]是第一個,然后您在命令行中傳遞。

打開輸出文件,然后打開每個輸入文件。 將每個輸入文件讀入輸出文件,然后全部關閉並退出。

打開一個文件。(這是argv1,但我想知道如何做argv2和argv3等。)

fopen(argv[2], ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM