2010-04-11 11 views
11
#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 

Del mismo modo, ¿Cómo se escribe a cabo in a la salida estándar o en un archivo ??¿Cómo leer y escribir una cadena STL C++?

Respuesta

21

Está intentando mezclar E/S estilo C con tipos C++. Al usar C++, debe usar las transmisiones std :: cin y std :: cout para la entrada y salida de la consola.

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

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

Pero cuando se lee un std :: string paradas cin lectura tan pronto como se encuentra con un espacio o una nueva línea. Es posible que desee utilizar getline para obtener una línea completa de entrada desde la consola.

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

Utiliza los mismos métodos con un archivo (cuando se trata de datos no binarios).

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

ofs << myString; 
0

C++ cadenas deben ser leídos y escritos utilizando >> y << operadores y otros equivalentes de C++. Sin embargo, si desea utilizar scanf como en C, siempre se puede leer una cadena de la forma en C++ y utiliza sscanf con él:

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

La forma más fácil de salida de una cadena es con:

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

printf también funcionará: [printf fija]

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

El método c_str() devuelve un puntero a un nulo-ter cadena ASCII minada, que puede ser utilizada por todas las funciones C estándar.

+2

Su uso de printf es insegura, debe ser 'printf ("% s ", s.c_str());' para evitar desbordamientos de búfer. – LiraNuna

+0

Tienes razón, lo corregiré. –

3

Hay muchas maneras de leer el texto de stdin en un std::string. Lo que pasa con std::string s es que crecen según sea necesario, lo que a su vez significa que se reasignan. Internamente, un std::string tiene un puntero a un buffer de longitud fija. Cuando el búfer está lleno y solicita agregar uno o más caracteres, el objeto std::string creará un nuevo búfer más grande en lugar del antiguo y moverá todo el texto al nuevo búfer.

Todo esto para decir que si conoce la longitud del texto que va a leer de antemano, entonces puede mejorar el rendimiento al evitar estas reasignaciones.

#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)); 

Todo lo anterior copiará todo el texto encontrado en stdin, hasta el final del archivo. Si sólo desea una sola línea, utilice std::getline():

#include <string> 
#include <iostream> 

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

Si quieres un solo carácter, utilice std::istream::get():

#include <iostream> 

// ... 
    char ch; 
    while(cin.get(ch)) { 
     // ... 
    } 
Cuestiones relacionadas