2010-12-30 3 views
5
string text; 
getline(text.c_str(),256); 

1) Я получаю сообщение об ошибке «Ошибка: нет функции соответствия для вызова«GetLine (сопзЬ символ *, Int)» Что плохого в приведенном выше, поскольку text.c_str() также возвращает указатель на массив символов.GetLine в IStream и GetLine в basic_string

Если я пишу, как этот

char text[256] 
cin.getline(text, 256 ,'\n'); 

он работает отлично. В чем разница между cin.getline и getline?

2) Каким образом

text string; 
getline(cin,text,'\n') 

принимает всю строку в качестве входных данных. Где указатель на массив символов в этом?

+2

Я предполагаю, что вы имеете в виду 'string text;' not 'text string;'. – aschepler

+2

Один вопрос на вопрос, пожалуйста. – aschepler

ответ

5

text.c_str() возвращает constchar *. Вы не может использовать его для изменения содержимого строки, никак. Он существует только для того, чтобы вы могли передавать строковые данные старым функциям C API без необходимости делать копию. Вам не разрешено вносить изменения, потому что не существует способа, чтобы строковый объект, содержащий данные, мог узнать о них, и поэтому это позволит вам разбить инварианты строки.

Кроме того, std::getlineпринимает совершенно разные параметры. (Вы бы это знали, если бы вы взяли две секунды, чтобы ввести «std :: getline» в Google.) Ошибка означает то, что она говорит: «никакая соответствующая функция для вызова» означает «вы не можете вызвать функцию с такими типами параметров ", потому что каждая перегрузка функции принимает что-то другое (и несовместимо).

std::getline принимает эти параметры:

  • поток. Вы должны передать это, потому что иначе он не знает, где читать.
  • Строковый объект для чтения.NOT буфер символов.
  • Необязательный символ разделителя строк (тот же, что и функция члена getline).

0 Наверх of ↑ "cin.getline". То, что вы вызываете, является функцией-членом «getline» объекта «cin» - глобальная переменная, которая определяется для вас, когда вы #include <iostream>. Обычно мы ссылаемся на это в соответствии с тем, в каком классе определена функция - таким образом, std::istream::getline.

std::istream::getline принимает эти параметры:

  • Буфер обугленного.
  • Необязательно, разделитель строк.

Он не нуждается в параметре потока, поскольку он является функцией-членом потока: он использует любой поток, с которым мы его вызывали.

1

text.c_str() - массив из const символов. const означает, что ни вы, ни какая-либо функция (включая любой вид getline) не может писать в нее.

Нет портативного способа использования string в качестве записываемого массива символов. Но при необходимости, вы можете использовать вместо vector<char>:

std::vector<char> buffer(256); 
std::size_t len = cin.getline(&buffer[0], buffer.size()); 
std::string text(&buffer[0], len); 

Но только используя string перегрузку getline, вероятно, лучше здесь.

1

string::c_str() возвращает const char *, а не char *. getline работы со строкой, так что вы хотите

string text; 
getline(cin, text, '\n'); 

Эта версия getline позволяет струна расти столько, сколько нужно. Если вам нужно ограничить его определенным количеством символов, вам нужно будет использовать vector<char>, как в предыдущем ответе.

3

Я действительно не понимаю, что пытается сделать этот вопрос.

C++ допускает перегрузку функций, поэтому компилятор ищет свободную функцию называется GetLine, совпадающие параметры, которые прошли, и нет такой функции не существует, и не должно существовать (что бы getline(const char*, int) сделать так или иначе?)

Вопрос задавался много раз, почему getline(istream&, string&) является «свободной» функцией, а не частью интерфейса iostream. Ответы, которые были высказаны, состоят в том, что iostream outdates STL или что iostream не зависит от класса basic_string (где угодно, и поэтому открытие файлов выполняется с помощью сырых указателей), и Herb Sutter будет признавать, что getline является свободной функцией, потому что он чувствует себя членом класса функции должны быть минимальными (и std :: string слишком много, например, функции find, которые могут быть свободными, которые используют класс).

Одна вещь об этой функции, хотя и полезна, так как вам не нужно заранее выделять буфер и «угадывать», как это сделать. (Сказав, что если вы читаете из большого файла в std :: string, вы можете bad_alloc, если новые строки не найдены!).

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