Как читать и писать строку STL С++?
#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
в stdout или в файл?
Ответы
Ответ 1
Вы пытаетесь смешивать ввод/вывод стиля 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;
Ответ 2
Существует много способов чтения текста из stdin в std::string
. Дело в std::string
заключается в том, что они растут по мере необходимости, что, в свою очередь, означает, что они перераспределяются. Внутренне a 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) ) {
// ...
}
Ответ 3
Строки С++ должны быть прочитаны и записаны с использованием операторов >>
и <<
и других эквивалентов С++. Однако, если вы хотите использовать scanf, как в C, вы всегда можете прочитать строку С++ и использовать sscanf с ней:
std::string s;
std::getline(cin, s);
sscanf(s.c_str(), "%i%i%c", ...);
Самый простой способ вывода строки:
s = "string...";
cout << s;
Но printf тоже будет работать:
[fixed printf]
printf("%s", s.c_str());
Метод c_str()
возвращает указатель на строку ASCII с нулевым завершением, которая может использоваться всеми стандартными функциями C.