Unix — строки C ++ в функции чтения из fcntl.h

В моем базовом курсе по программированию 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

Вот программа, для вашей справки.
Спасибо! 🙂

2

Решение

read ожидает буфер для заполнения прочитанных данных.

То, что ты делаешь, опасно.

Вы должны выделить буфер символов и убедиться, что вы добавили NULL char после длины строки как read не сделаю это за вас.
функция c_str предоставляет внутренний буфер, используемый классом string. Это только для чтения.

Перезапись самого строкового объекта наверняка вызовет сбой при последующем использовании.

char buff[11];
size_t bytes_read = read(fd, buff, 10);
buff[bytes_read] = 0; // terminate string
string myString(buff);
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).


Все остальные методы, которые вы пытались прочитать, просто очень неправильны.

0

По вопросам рекламы [email protected]