¿Leyendo enormes archivos txt de C++?

Estoy tratando de leer un texto enorme a través de C++. Tiene 70mb. Mi objetivo es crear subcadenas línea por línea y generar otro txt más pequeño que contenga solo la información que necesito.

Llegué al siguiente código para leer el archivo. Funciona perfectamente con archivos más pequeños, pero no con el monstruo de 70 mb.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
  ifstream myReadFile;
  myReadFile.open("C:/Users/Lucas/Documents/apps/COTAHIST_A2010.txt");
  char output[100];
  if (myReadFile.is_open()) {
    while (myReadFile.eof()!=1) {
         myReadFile >> output;
         cout<<output;
         cout<<"\n";
     }


    }
  system("PAUSE");
  return 0;
}

Este es el error que recibo: excepción no controlada en 0x50c819bc (msvcp100d.dll) en SeparadorDeAcoes.exe: 0xC0000005: ubicación de lectura de infracción de acceso 0x3a70fcbc.

Si alguien puede señalar una solución en C o incluso en C#, ¡eso también sería aceptable!

Gracias =)

preguntado el 03 de mayo de 12 a las 18:05

muere inmediatamente? ¿A medio camino del procesamiento? ¿Al final de la tramitación del expediente? -

La forma en que su bucle de entrada prueba EOF es un mala práctica. -

3 Respuestas

tu char output[100] buffer no puede tomar el contenido de una de las líneas.

Idealmente, debe usar un destino de cadena, y no un char[] tampón.

Editar Como se ha señalado, esta es una mala práctica y conduce a leer la última línea dos veces o una última línea perdida y vacía. Una escritura más correcta del bucle sería:

string output;
while (getline(myReadFile, output)) {
  cout<<output<<"\n";
}

**Editar - Dejando el código malo y malvado aquí:

Una reescritura rápida de su ciclo while interno podría ser:

string output;
while (myReadFile.good()) {
  getline(myReadFile, output);
  cout<<output<<"\n";
}

contestado el 04 de mayo de 12 a las 09:05

La forma en que prueba EOF en este código es una mala práctica. - Alto horno

Creo que su problema es que una de sus líneas tiene más de 100 caracteres. Necesidad de aumentar el tamaño de la matriz de caracteres.

contestado el 03 de mayo de 12 a las 18:05

No estas usando std::string, pero incluye el archivo de encabezado. Decidir. Utilizar cualquiera std::string o matriz de caracteres.

Además, use std::istream::read y proporcione el tamaño de la matriz a la función. Tendrá que repetir muchas veces ya que 100 caracteres es mucho más pequeño que 70 mb.

Intente asignar una matriz mucho más grande usando memoria dinámica:

const unsigned int array_size = 1024 * 1024 * 1024;

int main(void)
{
  char * output;
//...
  output = new char [array_size];
// read into output
// ...
// clean up
  delete [] output;
  return EXIT_SUCCESS;
}

Si utiliza std::string, use el constructor que toma un parámetro de tamaño para que pueda especificar el tamaño inicial de la cadena.

contestado el 03 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.