usar para macbook mac dev compilar como borland c++ stream streaming getline

c++ - para - compilar c en mac terminal



C++: posible problema Xcode(Mac). No se puede leer en nĂºmeros desde un archivo externo usando getline() (2)

Soy un usuario de Mac Xcode (3.2.2), trabajo con el compilador GCC 4.2, bastante inexperto con C ++ y completamente ignorante sobre los compiladores.

Necesito leer en números desde un archivo externo y almacenarlos en un vector de entradas. Escribí código usando streams y getline (). Puedo compilar el código y se ejecuta sin errores, pero no hay salida. Sin embargo, funciona para un amigo (compilador no compatible con Mac y sin GCC 4.2).

Busqué en Google y encontré varias publicaciones sobre un posible problema del compilador (gcc, Apple) en Xcode 3.2.1 que podría estar relacionado con mi problema (este, por ejemplo: C ++ con getline () imprime: el puntero liberado no estaba asignado en XCode. Sin embargo, tengo Xcode 3.2.2. Probé las soluciones sugeridas (relacionadas con la adición de _GLIBCXX_FULLY_DYNAMIC_STRING a (1) la ventana de configuración de destino o (2) como macros de preprocesador antes de las incluidas), pero mi problema aún no está resuelto.

Así que no sé cuál es mi problema en este momento, si es el mismo problema de compilación que las personas tenían en Xcode 3.2.1, pero se requiere una solución diferente en 3.2.2. O si hay algún otro problema en mi código.

Sería genial si alguien pudiera ofrecer algún consejo. Ningún consejo es demasiado simple. Si hay otra forma de importar números desde un archivo externo, me encantaría saberlo. Además, ¿alguien sabe si habría alguna razón por la que sería posible importar datos desde un archivo .dat, pero no un archivo .txt en una Mac?

Gracias.

Desde la primera publicación, he incluido las ediciones de wilhelmtell.

Objetivo: Leer números de un archivo de texto en un vector de enteros llamado "resultados".

1) Los datos en el archivo de datos test.dat inicialmente parecían,

//Prueba

prueba

''1'' ''2'' ''3''

// También hay etiquetas y comentarios en el archivo de texto que no quiero leer pero que no puedo eliminar del archivo.

#include <algorithm> #include <cctype> #include <iterator> #include <fstream> #include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; // Edited: added struct (wilhelmtell''s advice) struct not_digit_and_not_whitespace { bool operator()(char c) const { return ! std::isdigit(c) && ! std::isspace(c); } }; int main() { system("pwd"); std::string line; const std::string fileName = "/Users/me/test.dat"; ifstream theStream( fileName.c_str() ); if( ! theStream ) std::cerr << "Error opening file test.dat/n"; std::getline( theStream, line ); // line.erase(remove( line.begin(), line.end(), ''/''' ), line.end() ); // Edited (wilhelmtell''s advice) line.erase(remove_if( line.begin(), line.end(),not_digit_and_not_whitespace()), line.end() ); // Edited: added (wilhelmtell''s advice) std::istringstream myStream( line ); std::vector<int> numbers((std::istream_iterator<int>(myStream)), std::istream_iterator<int>()); std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, "/n")); /* int temp; // Edited: wilhemtell suggested using iterators instead. while ( myStream >> temp ){ numbers.push_back( temp ); std::cout << temp << std::endl; }*/ return 0; }


Esto podría funcionar para ti. Utiliza getline como estaba intentando, pero usa el carácter ''/' ''para servir como el delimitador de línea. Ignora todo hasta el primero ''. Asumir todo hasta el próximo ''es parte de un número. Continúe hasta que la lógica falle (presumiblemente debido al final del archivo).

#include <fstream> #include <iostream> #include <vector> #include <string> #include <sstream> #include <iterator> int main() { system("pwd"); std::string line; const std::string fileName = "test.dat"; std::ifstream theStream( fileName.c_str() ); if( ! theStream ) std::cerr << "Error opening file test.dat/n"; std::vector<int> numbers; while (true) { // get first '' std::getline(theStream, line, ''/'''); // read until second '' std::getline(theStream, line, ''/'''); std::istringstream myStream( line ); int i; myStream >> i; if (myStream.fail()) break; numbers.push_back(i); } std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, "/n")); }


Supongo que su archivo test.dat no está en el directorio de trabajo. Para verificar que puedes probar la transmisión:

if( ! theStream ) std::cerr << "Error opening file test.dat/n";

Compruebe las propiedades de su proyecto en XCode para ver cuál es el directorio de trabajo y coloque el archivo allí.

Si su archivo contiene datos que no se analizan como enteros, el análisis int las secuencias fallará. Asegúrate de que la línea que lees no tenga nada más que números enteros y espacios en blanco:

#include <cctype> // algorithm iterator ... struct not_digit_and_not_whitespace { bool operator()(char c) const { return ! std::isdigit(c) && ! std::isspace(c); } }; // ... line.erase(remove_if( line.begin(), line.end(), not_digit_and_not_whitespace()), line.end() );

Además, puedes simplificar tu código. Primero, si incluye <iostream> entonces no necesita <istream> . En segundo lugar, puede usar el constructor de rango de std::vector para obtener los enteros.

#include <algorithm> // iterator fstream iostream vector string sstream int main() { std::string line; std::ifstream theStream("test.dat"); std::getline(theStream, line); line.erase(std::remove(line.begin(), line.end(), ''/''' ), line.end()); std::istringstream myStream(line); std::vector<int> numbers((std::istream_iterator<int>(myStream)), std::istream_iterator<int>()); std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, "/n")); return 0; }