2011-06-20 17 views
15

Tengo un vector grande.Cómo escribir valores vectoriales en un archivo

Las formas en que uso multiplican enormemente el tiempo de ejecución del programa. El primero es escribir todos los valores en una cadena, ya que se calculan usando stringstreams y luego escriben la cadena en un archivo. El otro método es hacer una cadena larga después del hecho y escribir eso en el archivo. Sin embargo, ambos son muy lentos.

¿Hay alguna manera de simplemente escribir los valores del vector en el archivo de texto inmediatamente con saltos de línea?

+2

"¿Hay una manera de escribir sólo los valores del vector en el fichero de texto inmediatamente sin saltos de línea? " - ¿Necesitas con o sin saltos de línea? – Ajay

+1

Me alegro de ver que mi programa termine lo que antes lo tomaba 3 horas en 5 minutos XD – TimeCoder

Respuesta

33

El uso de std::ofstream, std::ostream_iterator y std::copy() es la forma habitual de hacerlo. He aquí un ejemplo con std::string s usando la sintaxis de C++ 98 (se hizo la pregunta de pre-C++ 11):

#include <fstream> 
#include <iterator> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::vector<std::string> example; 
    example.push_back("this"); 
    example.push_back("is"); 
    example.push_back("a"); 
    example.push_back("test"); 

    std::ofstream output_file("./example.txt"); 
    std::ostream_iterator<std::string> output_iterator(output_file, "\n"); 
    std::copy(example.begin(), example.end(), output_iterator); 
} 
+2

Debe tener cuidado al usar una cadena como ejemplo. Como lo contrario para cargar un vector de cadenas es diferente (es el único tipo estándar donde la salida/entrada será diferente). –

+11

Usted escribe "la pregunta fue hecha antes de C++ 11" - ¿hay alguna otra manera con C++ 11 para hacer esto? – Default

4

Tal vez me he perdido algo, pero lo que es malo:

std::ofstream f("somefile.txt"); 
for(vector<X>::const_iterator i = v.begin(); i != v.end(); ++i) { 
    f << *i << '\n'; 
} 

que evita tener que hacer la concatenación de cadenas potencialmente cuadrática, que supongo que es lo que está matando a su tiempo de ejecución.

+0

Disculpe, ¿qué representan v y X? – TimeCoder

+0

'v' es su vector que contiene. 'X' es el tipo que contiene. – Johnsyweb

6
#include <fstream> 
#include <vector> 
#include <string> 

int main() 
{ 
    std::vector<std::string> v{ "one", "two", "three" }; 
    std::ofstream outFile("my_file.txt"); 
    // the important part 
    for (const auto &e : v) outFile << e << "\n"; 
} 
Cuestiones relacionadas