2014-09-23 41 views
2

在大學時我的基本的Linux程序設計過程中,我們使用fcntl.h unistd.h中和使用 C++字符串,我得到如下:C++字符串中讀取功能從fcntl.h

statusOfFunction = write(fileDescriptor, input.c_str(), input.length()); 

這條線工作。我得到一個創建的文件,其中包含輸入字符串的內容。但是,爲什麼沒有任何這些行的工作:

statusOfFunction = read(fileDescriptor, reading.c_str(), 10); 
Error: No matching function call to "read" 

statusOfFunction = read(fileDescriptor, reading, 10); 
Error: No matching function call to "read" 

statusOfFunction = read(fileDescriptor, &reading, 10); 
No error throws up, but does not get executed 

statusOfFunction = read(fileDescriptor, &reading.c_str(), 10); 
Error: No matching function call to "read" 

https://www.dropbox.com/s/lnw208uo3xurqxf/Basic%20Unix%20Operations%20on%20Text%20Files.cpp?dl=0

這裏是程序,供大家參考。 謝謝! :)

+0

什麼是「閱讀」?你需要將原型與'read'匹配,根據'man 2 read',它是'ssize_t read'(int fd,void * buf,size_t count);'所以你需要讀取一個void指針到足夠大的緩衝區保存10個字節(或者你的「count」)。 – PSkocik 2014-09-23 08:51:46

+0

在您的基本Linux編程課程中,他們還沒有涵蓋'const'的含義? – WhozCraig 2014-09-23 08:56:46

回答

0

與第一

statusOfFunction = read(fileDescriptor, reading.c_str(), 10); 

的問題是,c_str聲明爲返回一個const指針。否則,這是接近正確的方法。

所有你需要創建一個包含至少10個字符的字符串的第一:

std::string temp_string(10, ' '); // Creates a string contains 10 spaces 

然後,你需要使用地址的運營商&通過非恆定的指針,你可以得到和字符串數組索引運算符[]

statusOfFunction = read(fileDescriptor, &temp_string[0], temp_string.length()); 

最後,你把它分配給實際的字符串:

reading = std::string(temp_string, 0, statusOfFunction); 

當然,你應該檢查statusOfFunction所以它不是一個錯誤(當它-1)或文件結束時(當它的0)。


您嘗試讀取的所有其他方法都非常錯誤。

+0

它仍然不起作用:( https://www.dropbox.com/s/lnw208uo3xurqxf/Basic%20Unix%20Operations%20on%20Text%20Files.cpp?dl=0 請檢查代碼我是否在任何地方出錯? – 2014-09-23 10:44:52

+0

@NadeemAhmedNajeeb對於初學者來說,你會錯過我告訴你創建帶有爲其分配內存的字符串的位置。你在鏈接代碼中所做的事情是讀入一個空字符串,導致未定義的行爲。 – 2014-09-23 11:04:37

+0

我嘗試過,但是我也得到一個錯誤: std :: string sample(10); 沒有匹配的初始化構造函數 另外,我嘗試使用示例[10],思考[]可能被重載。原來我錯了 – 2014-09-23 11:06:46

0

read需要一個緩衝區來填充讀取的數據。

你在做什麼是危險的。

您應該分配一個字符緩衝區,並確保您在字符串長度後添加NULL字符,因爲read不會爲您做。 c_str函數公開了字符串類使用的內部緩衝區。它是隻讀的。

覆蓋字符串對象本身會在以後使用時導致崩潰。

char buff[11]; 
size_t bytes_read = read(fd, buff, 10); 
buff[bytes_read] = 0; // terminate string 
string myString(buff); 
+0

感謝您的回答:) 因此,在Unix庫中大量使用C++字符串是不可取的? – 2014-09-23 11:12:59

+0

不建議您使用它們的方式。有I/O的C++類。將低級C函數與字符串類混合是很危險的。在任何情況下'c_str()'都會返回一個const數組 - 所以你不應該修改它。 – egur 2014-09-23 12:06:39

+0

C++ I/O也可以用於Unix嗎? – 2014-09-24 01:14:53