Googlear archivo de entrada he encontrado dos formas de entrada de texto desde un archivo – fopen y ifstream. A continuación están los dos fragmentos. Tengo un archivo de texto que consta de una línea con un número entero tengo que leer. Debo usar fopen o ifstream?

FRAGMENTO 1 – FOPEN

FILE * pFile = fopen ("myfile.txt" , "r");
char mystring [100];
if (pFile == NULL) 
{
    perror ("Error opening file");
}
else 
{
    fgets (mystring , 100 , pFile);
    puts (mystring);
    fclose (pFile);
}

FRAGMENTO 2 – IFSTREAM

string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
    while ( myfile.good() )
    {
        getline (myfile,line);
        cout << line << endl;
    }
    myfile.close();
}
else 
{  
    cout << "Unable to open file"; 
}

OriginalEl autor | 2011-06-19

2 Comentarios

  1. 16

    Yo preferiría ifstream porque es un poco más modular que fopen. Supongamos que desea que el código que lee a partir de la corriente de leer también a partir de una cadena de secuencia, o de cualquier otro istream. Podría escribir así:

    void file_reader()
    { 
        string line;
        ifstream myfile ("example.txt");
        if (myfile.is_open())
        {
            while (myfile.good())
            {
              stream_reader(myfile);
            }
            myfile.close();
        }
        else 
        {  
            cout << "Unable to open file"; 
        }
    }
    
    void stream_reader(istream& stream)
    {
        getline (stream,line);
        cout << line << endl;
    }

    Ahora usted puede probar stream_reader sin el uso de un archivo real, o se usa para leer la de otros tipos de entrada. Esto es mucho más difícil con fopen.

    ¿Por qué no void stream_reader(FILE *stream) { fgets(line, len, stream); puts(line); } ser esencialmente idénticos?
    Es posible crear un FILE* sin una llamada a fopen o tmpfile? Yo no lo creo, pero puedo estar equivocado. Desde el funcionamiento de stream_reader sólo requiere de un río, no un archivo, preferiría no overconstrain se requiere de un FILE*. En la unidad de pruebas podría ser más fácil pasar de una cadena de corriente en lugar de una FILE*, por ejemplo.
    Sí, desde esa perspectiva, la versión en C es más restringido — no existe ninguna disposición para FILE * que se refiere a una cadena en lugar de un archivo, al menos en la norma (aunque algunas bibliotecas han proporcionado/uso de, al menos internamente, por bastante tiempo). Si realmente necesidad de evitar que, puede pasar un puntero a una función para hacer la escritura, pero es definitivamente más torpe.
    Sin duda un +1 para esta respuesta – yo uso ostream en mi código para la misma modularidad – ser capaz de decidir si quiero que la salida de datos a un archivo, el terminal, etc.

    OriginalEl autor Josh Peterson

  2. 28

    Ya que este es etiquetado como C++, he de decir ifstream. Si fue marcada como C, me gustaría ir con fopen 😛

    Creo que la C de la interfaz es más limpia para la lectura de archivos, pero +1 de todos modos.

    OriginalEl autor Vinicius Kamakura

Dejar respuesta

Please enter your comment!
Please enter your name here