В моем базовом курсе по программированию 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
Вот программа, для вашей справки.
Спасибо! 🙂
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);
Проблема с первым
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
).
Все остальные методы, которые вы пытались прочитать, просто очень неправильны.