2012-03-01 30 views
7

Traté de hacerlo de esta maneraCómo leer una cantidad específica de caracteres desde un archivo de texto

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char b[2]; 
    ifstream f("prad.txt"); 
    f>>b ; 
    cout <<b; 
    return 0; 
} 

Debe leer 2 caracteres, pero se lee toda la línea. Esto funcionó en otro idioma pero no funciona en C++ por alguna razón.

+0

+1 y "Gracias" por proporcionar un programa de muestra breve y completo. http://sscce.org –

+4

"Esto funcionó en otro idioma pero no funciona en C++ por algún motivo". Esta es una de las peores suposiciones que puede hacer en la programación. Son dos idiomas diferentes, por lo que pueden tener un comportamiento diferente. – PlasmaHH

+0

Sí, es bastante peligroso andar pensando eso. Si vienes a C++ desde Java (que es lo que parece por tu error) realmente necesitas sentarte leyendo algunos punteros y matrices y asegúrate de obtener lo que está sucediendo antes de dispararte en el pie. – zmccord

Respuesta

8

Puede utilizar read() para especificar el número de caracteres a leer:

char b[3] = ""; 
ifstream f("prad.txt"); 

f.read(b, sizeof(b) - 1); // Read one less that sizeof(b) to ensure null 
cout << b;    // terminated for use with cout. 
+1

Para hacer que la relación entre '3' y' 2' sea un poco más evidente, aconsejaría usar una constante con nombre. 'size_t const BufferSize = 2;', 'char b [BufferSize + 1] =" ";' y 'f.read (b, BufferSize);' –

+0

@MatthieuM., Yo normalmente usaría 'sizeof (b) - 1 '(si es posible). Código actualizado – hmjd

+0

Siempre me resisto a recomendar esto, porque si 'b' es un puntero, la compilación sigue funcionando y usted obtiene un' 7' fijo en las plataformas de 64 bits. Sin embargo, podría usar una función 'size' para matrices, con plantillas es fácil. –

0
istream& get (char* s, streamsize n); 

Extractos personajes de la corriente y las almacena como una c-cadena en la matriz a partir de las s. Los caracteres se extraen hasta que se hayan extraído (n - 1) caracteres o que se encuentre el carácter delimitador '\ n' . La extracción también se detiene si se llega al final del archivo en la secuencia de entrada o si se produce un error durante la operación de entrada. Si se encuentra el carácter delimitador, no se extrae de la secuencia de entrada y permanece como el siguiente carácter que se extraerá. Use getline si desea que este carácter sea extraído (y descartado). El carácter nulo final que señala el final de una cadena de caracteres es que se agrega automáticamente al final del contenido almacenado en s.

2

Esto funcionó en otro idioma, pero no funciona en C++ por alguna razón .

Algunas cosas cambian de un idioma a otro. En particular, en este caso se ha encontrado con el hecho de que en C++ los punteros y matrices son apenas diferentes. Esa matriz se pasa al operador >> como un puntero a char, que se interpreta como un puntero de cadena, por lo que hace lo que hace a los búfers de carga (para leer hasta el límite de ancho o final de línea, lo que ocurra primero). Su programa debería estrellarse cuando eso ocurra, ya que está desbordando su memoria intermedia.

Cuestiones relacionadas