elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Top 20 herramientas Hacking más populares de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con Ficheros C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con Ficheros C++  (Leído 1,457 veces)
98Fran

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Duda con Ficheros C++
« en: 15 Septiembre 2019, 00:27 am »

Cuando imprime el contenido del .txt por la consola, al final del programa me imprime 2 endl, por? No debería ser 1 solo endl?

Código
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. void LecturaArchivo();
  5.  
  6. int main(){
  7.  
  8. LecturaArchivo();
  9.  
  10. return 0;
  11. }
  12.  
  13. void LecturaArchivo(){
  14. std::string Ruta, Frase;
  15. std::ifstream Archivo;
  16.  
  17. std::cout << "Digite la ruta del archivo para abrir entre \"\"\nRuta: ";
  18.  
  19. std::getline(std::cin,Ruta);
  20.  
  21. Archivo.open(Ruta.c_str(),std::ios::in);
  22.  
  23. if (Archivo.fail()){
  24. std::cout << "No se pudo abrir el Archivo";
  25. exit(1);
  26. }
  27.  
  28. std::cout << "\n\n";
  29. while (!Archivo.eof()){
  30. std::getline(Archivo,Frase);
  31. std::cout << Frase << std::endl;
  32. }
  33. }


En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 1.752



Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #1 en: 15 Septiembre 2019, 01:25 am »

Saludos,

- Lo he probado y solo me imprime un endl, no será que tu .txt ya tiene un endl extra?


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 904



Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #2 en: 15 Septiembre 2019, 02:46 am »

Como bien te han dicho, si te aparecen 2 endl será que el propio fichero acaba con un endl.
Puede que el endl del final del fichero lo hayas colocado tú manualmente o que tengas alguna opción activada en el editor para que añada automáticamente un endl al final de un fichero antes de guardarlo.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Loretz

Desconectado Desconectado

Mensajes: 112


Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #3 en: 15 Septiembre 2019, 04:08 am »

Código:
while (!Archivo.eof()){
std::getline(Archivo,Frase);
std::cout << Frase << std::endl;
}

ese es un error muy común, un trozo de código fósil, que vaya a saber por qué se repite meticulosamente en los primeros palotes. ¿Mucho copiar y pegar el código de malos programadores del siglo XX?  (Ah, por las dudas, XX se lee "veinte")

Bueno, si te fijas un poco en lo que hace ese fragmento de código, Archivo no tiene activa la señal de eof hasta que no se pretenda leer más allá de la última linea, o ¿de qué otra manera sabría Archivo que se ha alcanzado la última?

A modo de curiosidad histórica, hace muchos, muchos años, creo que la última vez que se vio fue alrededor de 1960, los archivos se guardaban en cintas magnéticas, y cuando un archivo tenía una parte en una cinta y otra parte en otra, era necesario poner una "marca de fin de archivo" (de ahí el nombre eof - end of file). Entonces, un archivo tenía al final esa marca, normalmente 0xFFFF, que si fuera un int se leería como -1. Pero eso era así en la época en tus abuelos se conocieron, desde entonces las cosas han cambiado un poco, y algo que cambió son los filesystems, de modo que los archivos ya no llevan una "marca de fin de archivo", nunca más, desde hace muuuuucho tiempo.

En línea

98Fran

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #4 en: 15 Septiembre 2019, 22:34 pm »

Código:
while (!Archivo.eof()){
std::getline(Archivo,Frase);
std::cout << Frase << std::endl;
}

ese es un error muy común, un trozo de código fósil, que vaya a saber por qué se repite meticulosamente en los primeros palotes. ¿Mucho copiar y pegar el código de malos programadores del siglo XX?  (Ah, por las dudas, XX se lee "veinte")

Bueno, si te fijas un poco en lo que hace ese fragmento de código, Archivo no tiene activa la señal de eof hasta que no se pretenda leer más allá de la última linea, o ¿de qué otra manera sabría Archivo que se ha alcanzado la última?

A modo de curiosidad histórica, hace muchos, muchos años, creo que la última vez que se vio fue alrededor de 1960, los archivos se guardaban en cintas magnéticas, y cuando un archivo tenía una parte en una cinta y otra parte en otra, era necesario poner una "marca de fin de archivo" (de ahí el nombre eof - end of file). Entonces, un archivo tenía al final esa marca, normalmente 0xFFFF, que si fuera un int se leería como -1. Pero eso era así en la época en tus abuelos se conocieron, desde entonces las cosas han cambiado un poco, y algo que cambió son los filesystems, de modo que los archivos ya no llevan una "marca de fin de archivo", nunca más, desde hace muuuuucho tiempo.


Sabes que mas de perdió de aquella época? parece ser el respeto, tu sarcasmo sobra.

Primero, estoy aprendiendo a programar y así es como me lo están enseñando. Segundo, si eres un amargado de la vida mejor postea en otro sitio, gracias ^.^
En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 1.752



Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #5 en: 15 Septiembre 2019, 23:47 pm »

- Jeje, a Loretz le faltó justificar algo más para que no se le mal-interprete. He estado revisando el ebook (gratuito en inglés) C++ Notes for Professionals: https://books.goalkicker.com/CPlusPlusBook/ Capítulo 12: File i/O, Sección 12.3 Reading from a file, habla otros métodos para leer ficheros, veo no usa EOF directamente.

- Luego en la Sección 12.7: Checking end of file inside a loop condition, bad
practice?, veo algo muy similar a lo que comenta Loretz, aunque no le entiendo bien XD, e hecho algunas pruebas y no noto diferencias XD.

- Por cierto, si estás iniciando en C++, te recomendaría estos ebooks gratuitos en español:
https://openlibra.com/es/book/fundamentos-de-programacion-con-el-lenguaje-de-programacion-c-ed-2017
http://arco.esi.uclm.es/~david.villa/pensar_en_C++/pensar_en_cpp-vol1.pdf
http://arco.esi.uclm.es/~david.villa/pensar_en_C++/pensar_en_cpp-vol2.pdf

-- Ya luego revisas ebooks avanzados de tips como el de Notes for Professionals o las Referencias Oficiales.
En línea

Loretz

Desconectado Desconectado

Mensajes: 112


Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #6 en: 16 Septiembre 2019, 05:04 am »

Sabes que mas de perdió de aquella época? parece ser el respeto, tu sarcasmo sobra.

Primero, estoy aprendiendo a programar y así es como me lo están enseñando. Segundo, si eres un amargado de la vida mejor postea en otro sitio, gracias ^.^

Mis disculpas, pero la cosa no era contigo que eres la víctima. Sucede que por alguna razón hay una manía de enseñar C++ como si se estuviera en los 70s, con construcciones y rutinas propias de los 50. Y no sé muy bien por qué, pero me disgusta de sobremanera. Yo también he tenido que pasar por el mismo tratamiento de quienes enseñar vicios y usan el poder de una cátedra para que todo el mundo esté obligado a reproducirlos. Me parece francamente despreciable, y no conseguí decirlo bien.

Va una aclaración por si sirviera:

La construcción
Código:
while (!Archivo.eof()){
es por lo menos incompleta, ya la suspensión de la lectura con getline puede deberse a más de una causa.

std::ifstream tiene un operator bool, que equivale a !fail(), que es lo que permite la lectura en ciclos.
Documentación: https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

La forma canónica sería:

Código
  1.    while (std::getline(Archivo, Frase)) {
  2.        std::cout << Frase << std::endl;
  3.    }
  4.  
  5.    // Si interesa saber que ha resultado:
  6.    // (puedes consultar la documentaciOn:
  7.    // https://en.cppreference.com/w/cpp/io/ios_base/iostate
  8.  
  9.    if (Archivo.good())
  10.        std::cout << "Sin error.\n";
  11.    else if (Archivo.eof())
  12.        std::cout << "End of file.\n";
  13.    else if (Archivo.fail())
  14.        std::cout << "Error de lectura.\n";
  15.    else if (Archivo.bad())
  16.        std::cout << "Error irrecuperable.\n";

En línea

98Fran

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #7 en: 17 Septiembre 2019, 16:43 pm »

- Jeje, a Loretz le faltó justificar algo más para que no se le mal-interprete. He estado revisando el ebook (gratuito en inglés) C++ Notes for Professionals: https://books.goalkicker.com/CPlusPlusBook/ Capítulo 12: File i/O, Sección 12.3 Reading from a file, habla otros métodos para leer ficheros, veo no usa EOF directamente.

- Luego en la Sección 12.7: Checking end of file inside a loop condition, bad
practice?, veo algo muy similar a lo que comenta Loretz, aunque no le entiendo bien XD, e hecho algunas pruebas y no noto diferencias XD.

- Por cierto, si estás iniciando en C++, te recomendaría estos ebooks gratuitos en español:
https://openlibra.com/es/book/fundamentos-de-programacion-con-el-lenguaje-de-programacion-c-ed-2017
http://arco.esi.uclm.es/~david.villa/pensar_en_C++/pensar_en_cpp-vol1.pdf
http://arco.esi.uclm.es/~david.villa/pensar_en_C++/pensar_en_cpp-vol2.pdf

-- Ya luego revisas ebooks avanzados de tips como el de Notes for Professionals o las Referencias Oficiales.

Gracias!, Les echare un vistazo ^.^
En línea

98Fran

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #8 en: 17 Septiembre 2019, 16:46 pm »

Mis disculpas, pero la cosa no era contigo que eres la víctima. Sucede que por alguna razón hay una manía de enseñar C++ como si se estuviera en los 70s, con construcciones y rutinas propias de los 50. Y no sé muy bien por qué, pero me disgusta de sobremanera. Yo también he tenido que pasar por el mismo tratamiento de quienes enseñar vicios y usan el poder de una cátedra para que todo el mundo esté obligado a reproducirlos. Me parece francamente despreciable, y no conseguí decirlo bien.

Va una aclaración por si sirviera:

La construcción
Código:
while (!Archivo.eof()){


es por lo menos incompleta, ya la suspensión de la lectura con getline puede deberse a más de una causa.

std::ifstream tiene un operator bool, que equivale a !fail(), que es lo que permite la lectura en ciclos.
Documentación: https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

La forma canónica sería:

Código
  1.    while (std::getline(Archivo, Frase)) {
  2.        std::cout << Frase << std::endl;
  3.    }
  4.  
  5.    // Si interesa saber que ha resultado:
  6.    // (puedes consultar la documentaciOn:
  7.    // https://en.cppreference.com/w/cpp/io/ios_base/iostate
  8.  
  9.    if (Archivo.good())
  10.        std::cout << "Sin error.\n";
  11.    else if (Archivo.eof())
  12.        std::cout << "End of file.\n";
  13.    else if (Archivo.fail())
  14.        std::cout << "Error de lectura.\n";
  15.    else if (Archivo.bad())
  16.        std::cout << "Error irrecuperable.\n";


Lo siento yo tambien, por que mi contestación está demas y fuera fe tono :( , solo busco aprender cosas nuevas y soy de las personas que le cuesta mucho entender e interiorizar todo lo nuevo si no tengo con que referenciarlo. Le echare un vistazo aun que cuando es código suelto y lo ponen con nombres complicados como: std::basic_ios<CharT,Traits> ya no se ni como escribirlo en mi código xD, al menos hay ejemplos para que me figure mas o menos como va.
« Última modificación: 17 Septiembre 2019, 17:04 pm por 98Fran » En línea

LoneCoder

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Duda con Ficheros C++
« Respuesta #9 en: 30 Septiembre 2019, 11:01 am »

estoy seguro que Dennis Ritchie si aun estuviera vivo con 80 años que tendria te pegaria 100.000 vueltas como programador de C/C++...a ti Loretz, a mi y a cualquiera

en cuanto a las marcas de fin de archivo, puedes utilizar EOF perfectamente ya que funciona .... pero te recomendaria que estudiases un poco mejor el sistema de lectura de ficheros con fopen() fclose() fseek() fread() y fwrite() etc ya que tu forma de acceder al fichero es un poco "ambigua"

y otra cosa, ponerse a programar en C++ sin conocer a fondo primero el C es una mala practica
« Última modificación: 30 Septiembre 2019, 11:13 am por LoneCoder » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con ficheros y structs en C
Programación C/C++
chica_23 9 4,125 Último mensaje 19 Marzo 2011, 20:24 pm
por chica_23
Duda con manejo de Ficheros
Programación C/C++
Hack-11 3 1,572 Último mensaje 27 Noviembre 2011, 22:08 pm
por Eternal Idol
Duda sobre ficheros
Programación C/C++
asdavid 3 1,743 Último mensaje 6 Diciembre 2012, 15:57 pm
por leosansan
Duda con lectura de ficheros txt
Programación C/C++
Blaster 1 1,042 Último mensaje 11 Abril 2013, 21:13 pm
por Carloswaldo
Duda ficheros c++
Programación C/C++
oskrg55 3 1,312 Último mensaje 10 Agosto 2015, 17:14 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines