2012-12-05 59 views
4

我試圖寫出字符串中的字節的尺寸時使用的代碼寫()地址不正確

rtn=write(data,(strlen(PATHA)*sizeof(char)),sizeof(int)); 
if(rtn < 0) 
    perror("Writing data_file 2 "); 

我回來Writing data_file 2 : Bad address定義爲

#define PATHA "/tmp/matrix_a"

這究竟是一個壞地址?數據文件描述符是打開的,並在上面的代碼段之前和之後正確寫入。要寫入文件data的數據必須是原始數據,而不是ASCII。

我還試圖限定字符串作爲一個char []具有相同的問題

回答

2

的第二個參數write()一個功能是地址你想寫的字節數,但是你傳遞了你想寫的字節數。爲了獲得一個地址,你必須將這些字節存儲在一個變量中(你不能得到表達式結果的地址)。例如:

size_t patha_len = strlen(PATHA); 

rtn = write(data, &patha_len, sizeof patha_len); 
3

的第二個參數write()是緩衝器和第三個參數是大小:

ssize_t write(int fd, const void *buf, size_t count); 

張貼的代碼傳遞該長度被解釋爲不正確的地址。編譯器應該發出警告(不要忽略編譯器警告並在最高級別使用警告級別進行編譯)。

更改爲:

rtn=write(data, PATHA, strlen(PATHA)); 

sizeof(char)注意保證是1,因此它可以從大小計算被省略。

+0

更正,但不是ASCII文本,而是原始二進制數據。 – fotg

+0

@nos,我發現你是對的。我必須承認,我從來沒有發生過,並且已經得到回答。 – hmjd

4

到POSIX write()的參數是:

#include <unistd.h> 

ssize_t write(int fildes, const void *buf, size_t nbyte); 

這是一個:

  • 文件描述符
  • 緩衝
  • 大小

你已經通過兩種尺寸,而不是一個n地址和大小。

用途:

rtn = write(data, PATHA, sizeof(PATHA)-1); 

或:

rtn = write(data, PATHA, strlen(PATHA)); 

如果您正在尋找寫的字符串的大小爲int,那麼你就需要一個int變量傳遞到write() ,像這樣:

int len = strlen(PATHA); 

rtn = write(data, &len, sizeof(len)); 

請注意,除非要編寫size_t,否則不能只使用size_t變量;在64位的Unix系統上,特別是在一般情況下,sizeof(size_t) != sizeof(int),你需要決定你想寫哪個大小。

您還需要知道,有些系統是小端和其他大端,而您在一種類型上使用此機制編寫的內容在另一種類型上不可讀(未映射之前完成的映射或在I/O操作之後)。您可能會選擇忽視這個問題,或者您可能決定使用便攜式格式(通常稱爲「網絡順序」,相當於big-endian),或者您可能決定定義您的代碼使用相反訂購。您可以編寫代碼,以便在所有平臺上使用相同的邏輯(如果您小心)(並且所有平臺都能得到相同的答案)。

+0

我不認爲你的建議代碼是非常正確的。 OP希望寫出'PATHA'的長度而不是其內容 – simonc

+0

這是一種可能性 - 從問題中不清楚,但可能更有意義的是'sizeof(int)'。 –

1
rtn = write(data, PATHA, strlen(PATHA)); 

是你想要我想的。參數應該是

  1. 文件描述符(數據)
  2. 源緩衝器(您的字符串常量PATHA)
  3. 從該緩衝器拉的字節數(使用相同的PATHA的strlen()測定常量)

此外,爲了完整,您應該始終檢查rtn是否已寫入了多少個字符。不保證你寫入()所有描述符類型請求的字節。所以有時你最終會把它寫成大塊,這取決於它寫的答案的數量,還有你知道你還有多少人還沒有寫過。

2

Bad address錯誤已被回答。如果你想寫一個字符串的大小,只需使用printf

printf("Length: %d\n", strlen(data)); 

要麼,你可以寫,將一個整數轉換爲字符串,並打印了這一點......我喜歡printf :)

+0

我正在寫入文件描述符'data',寫入需要緩衝和原始,而不是ascii – fotg