2016-02-09 2 views
4

У меня есть следующий код:C++ Неправильное преобразование из полукокса * на символ (символ * = * string.begin())

std::string extract() { 

    fstream openfile("/home/name/Documents/testfile"); 
    std::string teststring; 
    long location = 4; 
    long length = 2; 
    teststring.resize(length); 
    char* begin = *teststring.begin(); 
    openfile.seekp(location); 
    openfile.read(begin, length); 

    return teststring; 
} 

Этот код должен возвращать строку символов, найденных в файл. Например, если содержимое файла

StackOverflow 

этот метод должен возвращать

kO 

Этот код был дан мне в дружественной StackOverflow пользователя. Моя проблема в том, что я получаю ошибку компиляции, которая гласит: «Недопустимое преобразование из char * в char». Проблема заключается в том, что

char* begin = *teststring.begin(); 

линия. Как я могу это исправить?

+1

и LHS является '' символ *, в то время как RHS является 'char'. Просто удалите '*' из RHS. – bartgol

+0

@Pavel Gatnar это дает ошибку кода ошибки: невозможно преобразовать 'std :: basic_string :: iterator * {aka __gnu_cxx :: __ normal_iterator > *}' в 'char *' при инициализации – Peter111

+1

@bartgol Итератор строки не является символом * –

ответ

5

teststring.begin() возвращает итератор, и если вы разыщите его с помощью оператора *, вы получите ссылку на символ (char&).

Таким образом, вы можете взять его адрес, как:

char* begin = &*teststring.begin(); 

Или вы можете просто сделать:

char* begin = &teststring[0]; 

Или

char* begin = &teststring.front() //(C++11) [@Jonathan Wakely] 

То же самое относится и к векторам. Altho в векторе (C++ 11) добавлена ​​новая функция под названием data(), которая возвращает указатель на T;

так с вектором вы могли бы просто сделать

char * begin = myvector.data(); // (if T is char) 
+1

И еще один способ: '& teststring.front()' –

+0

Обновлено, на самом деле не знал об этом (похоже, C + 11). Был использован для двух других. – Jts

+0

Спасибо! Оно работает. Я использую char * begin = & * teststring.begin(); и он прекрасно работает – Peter111

1

Если вы хотите преобразовать значение итератора в базовые данные, есть трюк, чтобы получить указатель на первый элемент.

auto iterator_testdata = testdata.begin(); 
char* first_element_in_testdata = &(*iterator_testdata); 

При условии, что итератор итерирует значения символов.

Этот трюк также работает для векторов :: begin() и подобных непрерывных контейнеров. Используйте с осторожностью.

Смежные вопросы