Как читать и писать строки STL C ++? - PullRequest
16 голосов
/ 11 апреля 2010
#include<string>
...
string in;

//How do I store a string from stdin to in?
//
//gets(in) - 16 cannot convert `std::string' to `char*' for argument `1' to 
//char* gets (char*)' 
//
//scanf("%s",in) also gives some weird error

Аналогично, как мне записать in в стандартный вывод или в файл ??

Ответы [ 3 ]

27 голосов
/ 11 апреля 2010

Вы пытаетесь смешать ввод / вывод в стиле C с типами C ++.При использовании C ++ вы должны использовать потоки std :: cin и std :: cout для ввода и вывода консоли.

#include<string>
#include<iostream>
...
std::string in;
std::string out("hello world");

std::cin >> in;
std::cout << out;

Но при чтении строки std :: cin прекращает чтение, как только встречается пробелили новая строка.Возможно, вы захотите использовать getline для получения всей строки ввода с консоли.

std::getline(std::cin, in);

Вы используете те же методы с файлом (когда имеете дело с недвоичными данными).

std::ofstream ofs('myfile.txt');

ofs << myString;
4 голосов
/ 11 апреля 2010

Существует множество способов чтения текста из стандартного ввода в std::string. Что касается std::string s, то они растут по мере необходимости, что, в свою очередь, означает, что они перераспределяются. Внутренне std::string имеет указатель на буфер фиксированной длины. Когда буфер заполнен и вы запрашиваете добавить один или несколько символов на него, объект std::string создаст новый больший буфер вместо старого и переместит весь текст в новый буфер.

Все это говорит о том, что если вы знаете длину текста, который вы собираетесь прочитать заранее, то вы можете улучшить производительность, избегая этих перераспределений.

#include <iostream>
#include <string>
#include <streambuf>
using namespace std;

// ...
    // if you don't know the length of string ahead of time:
    string in(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());

    // if you do know the length of string:
    in.reserve(TEXT_LENGTH);
    in.assign(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());

    // alternatively (include <algorithm> for this):
    copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(),
         back_inserter(in));

Все вышеперечисленное скопирует весь текст, найденный в stdin, до конца файла. Если вам нужна только одна строка, используйте std::getline():

#include <string>
#include <iostream>

// ...
    string in;
    while( getline(cin, in) ) {
        // ...
    }

Если вам нужен один символ, используйте std::istream::get():

#include <iostream>

// ...
    char ch;
    while( cin.get(ch) ) {
        // ...
    }
1 голос
/ 11 апреля 2010

Строки C ++ должны читаться и записываться с использованием операторов >> и << и других эквивалентов C ++. Однако, если вы хотите использовать scanf как в C, вы всегда можете прочитать строку способом C ++ и использовать sscanf с ней:

std::string s;
std::getline(cin, s);
sscanf(s.c_str(), "%i%i%c", ...);

Самый простой способ вывести строку с помощью:

s = "string...";
cout << s;

Но printf тоже будет работать: [исправлено printf]

printf("%s", s.c_str());

Метод c_str() возвращает указатель на строку ASCII с нулевым символом в конце, которая может использоваться всеми стандартными функциями Си.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...