在大学的基础Linux编程课程中,我们使用fcntl.h和unistd.h 使用C ++字符串,我得到以下结果:
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 :(得分:0)
第一个问题
statusOfFunction = read(fileDescriptor, reading.c_str(), 10);
是声明c_str
返回 const
指针。否则,这是正确方法的结束。
首先,您需要创建一个至少包含10个字符的字符串:
std::string temp_string(10, ' '); // Creates a string contains 10 spaces
然后你需要传递一个非常量指针,你可以使用address-of运算符&
和字符串数组索引运算符[]
来获取:
statusOfFunction = read(fileDescriptor, &temp_string[0], temp_string.length());
最后你将它分配给实际的字符串:
reading = std::string(temp_string, 0, statusOfFunction);
当然,您应该检查statusOfFunction
所以这不是错误(当它是-1
时)或文件结束时(当它是0
时)。
您尝试阅读的所有其他方法都非常错误。
答案 1 :(得分:0)
read需要一个缓冲区来填充读取的数据。
你正在做的事情很危险。
您应该分配一个char缓冲区,并确保在字符串长度之后添加NULL char,因为read
将不会为您执行此操作。
c_str函数公开字符串类使用的内部缓冲区。它是只读的。
在以后使用时,覆盖字符串对象本身会导致崩溃。
char buff[11];
size_t bytes_read = read(fd, buff, 10);
buff[bytes_read] = 0; // terminate string
string myString(buff);