2013-06-01 88 views
-1

你好,我試圖模擬兩個程序,從網絡發送和接收文件,如客戶端和服務器。首先,我必須將文件拆分爲4096個字節的頁面,並將其發送到其他程序以創建該文件。我通過網絡發送和接收文件的方式是通過寫入和讀取。所以在客戶端程序中,我必須創建一個函數來接收這些包並將它們放入一個文件中。我無法想出將軟件包放入文件的方法。例如我一個文件有2頁,我必須使用這2頁創建另一個文件。另外我不知道他們是否按順序排列,所以我必須創建該文件並將它們放在正確的位置。在打開的文件的特定位置寫()

/*consider the connections are ok and the file's name is at char* name*/ 

int file=open(name,"O_CREAT | O_WRONLY,0666); 
char buffer[4096]; 
int pagenumber; 
for(int i=0;i<page_number;i++){ 
    read(socket,&pagenumber,sizeof(int)); 
    read(socket,buffer,sizeof(int)); 
    write(file(pagenumber*4096),buffer,4096); 
} 

此代碼適用於pagenumber = 0,但pagenumber = 1沒有任何反應!你可以幫我嗎?提前致謝!

+1

增加了兩個缺少';'和2')'...這可能不是問題 –

+0

'寫(文件(pagenumber * 4096),緩衝區,4096);'?什麼是'文件(pagenumber * 4096)'? –

+0

我並不是真正的意思,但它是幫助你理解問題的唯一方法! – JmRag

回答

1

要在文件中的某個位置寫上你必須使用lseek的

off_t lseek(int fd, off_t offset, int whence); 

它採用描述,偏移,最後一個參數是這些常數:

SEEK_SET偏移設置爲偏移字節。

SEEK_CUR偏移量設置爲當前位置加偏移量字節。

SEEK_END偏移量設置爲文件大小和偏移量字節。

如果你知道文件有多大,你可以使用ftruncate。

int ftruncate(int fd, off_t length); 

即使你創建一個文件,該文件是巨大的,因爲在Linux上大多數文件系統支持稀疏文件不管怎樣,磁盤上的實際文件將已寫入的塊的總和。

+0

非常感謝您的回答!你真的幫了我! – JmRag

1

write()的第一個參數是一個文件描述符,您可以使用open()。所以它應該是

int file = open(...); 
... 
write(file,buffer,4096); 

write(file(pagenumber*4096),buffer,4096); 

關於一個問題,如何在特定位置寫。您可以事先準備好寫入文件,然後使用seek()來定位要寫入的文件。有關尋求的描述,你可以look here

0

首先,Mario不會依賴'pagenumber'中的垃圾來繼續循環(這是第一次在此處檢查循環邊界條件時發生的)。現在,如果你正在寫頁碼'0',然後頁面跟隨它,pagenumber將被初始化爲0,並且你的循環將會出來。另外,請分別檢查寫入和讀取系統調用時寫入和讀取的字節。

+0

非常感謝您的通知我會改變它!你是對的! – JmRag