2014-09-20 68 views
-2

我正在做一個程序,它在命令行參數中讀取一個文件,併爲它讀取的每個單詞創建一個新文件。用read讀取一個文件word()

Ex。 1個10字的文件變成----> 10個文件,每個文件一個字。

我已經使用fread,fwrite,fget等工作,但是我們只允許使用read()和write()來讀寫文件。這樣做,這樣的時刻似乎很難得離譜,也不必,我開始覺得我們的老師只是告訴我們錯了,所以我的三個問題是:

  1. 這是可能的嗎?
  2. 是否通過操作read()的字節來完成?
  3. 有人能在外行的術語)解釋如何操作讀(/寫()採取不同長度的各種單詞

我明白閱讀()從輸入流中讀取,然後把它放到一個緩衝區但是我非常確定它不像Java那樣可以給它一個開始和停止位置,它會讀取它們之間的所有內容,然後繼續從位置停止+1讀取數據。

+2

(1)是的!如果你可以用'fread()'和'fwrite()'(和'fopen()'和'fclose()')來完成,那麼你可以用文件描述符I/O函數來完成。每個函數都有一個直接的映射 - 假設文件是​​一個磁盤文件,而不是像終端或管道或FIFO那樣的不可搜索的設備,並且您從未嘗試「ungetc()」一個您沒有剛剛閱讀。 (2)查看代碼會更容易,但是您可以輕鬆編寫一些小功能來執行與標準I/O功能相同的工作。 (3)像'fread()'和'fwrite()',但是你只需要簡單的字節數。 – 2014-09-20 17:34:11

+1

關於你的最後一段:你是如何用'fread'等來管理的? – mafso 2014-09-20 18:01:46

+0

如果你使用'fread'工作,你已經使用'read'工作,只要你自己處理由'stdio'庫提供的任何通常的緩衝。行爲是不同的(例如,你可能會讀/寫少於預期的字節),但是想法是一樣的:讀取字節,將讀取的字節中的單詞寫入單獨的文件中,說明部分單詞讀取的情況。 – 2014-09-21 00:16:54

回答

0

read()調用工作是這樣的:

int read(int handle, void *buffer, int nbyte); 

其中:handle是文件描述符,buffer就是字節讀取存儲,nbyte是要讀取的字節數。

要做你已經被告知要做的事情,我想你將不得不遍歷文件描述符來首先看看這個詞有多長,然後回到lseek()的起點(很簡單,就像你現在知道的那樣單詞的長度),然後使用read()讀取它。

+0

「在文件指針上迭代,首先查看單詞長度」 - 什麼文件指針? – Mat 2014-09-20 17:32:38

+1

不需要'lseek',只需使用寬緩衝。 – 2014-09-20 17:42:09

+0

我對「迭代文件指針」有點困惑,有沒有一個特定的功能來做到這一點。在執行lseek()和read()之後,我還必須使用lseek()去下一個文件的開頭,找到它的長度並讀取它? – 2014-09-20 18:18:04

1

並不複雜,這裏是一個片段,展示瞭如何從文件中讀取內容:

int fd = open("input.txt", O_RDONLY); // fd stands for file descriptor 
int length, i; 
char buffer[1000]; 
length = read(fd, buffer, 1000); // read() return the number of read characters 
for (i = 0; i < length; i++) { 
    putchar(buffer[i]); 
} 
printf("\n"); 
close(fd); 

更多有關open()read()close()看到使用man 2 function。在手冊頁中列出了編譯代碼所需的頭文件。

寫作會是這樣的:

fd = open("output.txt", O_WRONLY); 
write(fd, word, strlen(word)); // word is an array of char. 
+0

我會'讀'更大的緩衝區(例如8K字節= 8192字節),我可能會使緩衝區'靜態' – 2014-09-20 17:41:10

+0

嗯,這只是一個例子。緩衝區的大小很大程度上取決於輸入大小和其他因素。 – rendon 2014-09-20 17:42:32

+0

如果我正確閱讀此內容,請告訴我。你的read()讀取文件中的所有內容並返回文件的時間。另外,read()將整個文件存儲在char類型的緩衝區[]中(或者當您運行for-loop時,是否將其存儲)。最後,緩衝區[]存儲「空格」,我必須做一些類型的循環來檢查「空格」並在寫入之前將每個單詞從緩衝區[]中提取出來? – 2014-09-20 18:14:02