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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  fstream y fopen y sus modos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: fstream y fopen y sus modos  (Leído 4,355 veces)
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
fstream y fopen y sus modos
« en: 14 Abril 2014, 15:41 pm »

Hola tengo una duda respecto a los modos de fopen ya que estoy haciendo un programa que actualiza los dados de un archivo pero que funciona de una forma muy rara.
Asi no funciona:
Código
  1. ofstream file(fName,ios::binary | ios::out);
  2. file.seekp((100+sizeof(unsigned int))*--p);
  3. char name[100];
  4. string n=d.showName();
  5. int length=n.size()>99?99:n.size();
  6. strncpy_s(name,n.data(),length);
  7. name[length]='\0';
  8. file << name;
  9. unsigned int years=d.showYears();
  10. file.write((char*)&years,sizeof(unsigned int));
  11. if(file.fail())return false;
  12. return true;
Si cambio ios::out por ios::ate tampoco funciona ya que reemplaza lo ya escrito y no lo cambia.

Si utilizo ios::binary | ios::out si funciona pero no se porque ya que out es para coger datos del archivo ??
Me lo pueden explicar?

Gracias y saludos :)


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: fstream y fopen y sus modos
« Respuesta #1 en: 14 Abril 2014, 15:57 pm »

ios::in indica que vas a abrir el archivo para leerlo
ios::out indica que vas a abrir el archivo para escribirlo
ios::ate únicamente posiciona el cursor al final del archivo... no indica si vas a leer o a escribir

Código
  1. file.seekp((100+sizeof(unsigned int))*--p);

Deberías querer un poco más tu código y evitar líneas de este estilo... te pueden dar bastantes problemas si confundes la sintaxis lo más mínimo... y depurar una línea así puede no ser trivial.



En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: fstream y fopen y sus modos
« Respuesta #2 en: 14 Abril 2014, 17:22 pm »

A pues, gracias por responder yo había leído muchas veces en la documentación y ponía esto pero no se porque me había confundido así ya que esto lo había hecho mucho antes y sabia trabajar con archivos.
Entonces es out porque sale del programa para entrar en el archivo, yo pensaba que sale del archivo. Gracias ahora ya lo entiendo.
Pero ate si no indica si se lee o escribe debería de funcionar ya que lo utilizo con un ofstream para escribir.

Con respecto a la sintaxis tu como lo harias? Vas a crear una variable para los bytes a pasar? y luego --p a parte?
Yo con la sintaxis casi nunca me confundo.

En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: fstream y fopen y sus modos
« Respuesta #3 en: 14 Abril 2014, 17:49 pm »

Yo con la sintaxis casi nunca me confundo.

El problema es que ese "casi", en determinadas líneas, puede suponer un problema:

Código
  1. int valor = variable1+++ variable2;
  2. int valor = variable1++ +variable2;
  3. int valor = variable1+ ++variable2;
  4. int valor = variable1 +++variable2;
  5. int valor = variable1+++variable2;

los cinco códigos se parecen como gotas de agua... ponte tu a descubrir que el espacio lo has puesto en un sitio en vez de en otro... y claro, evaluar las variables en mitad de la línea no es trivial...

Efectivamente, sería más legible y menos propenso a errores sacar el --p fuera de esa expresión... no hay que ser tacaño a la hora de escribir líneas de código si la idea es mejorar la legibilidad y el mantenimiento futuro del código.

Pero ate si no indica si se lee o escribe debería de funcionar ya que lo utilizo con un ofstream para escribir.

El problema es que con ate no indicas si vas a leer o escribir... en este caso la función puede que haga uso del mecanismo por defecto ( que seguro que no sabes cual es ) o puede que directamente no permita realizar operaciones sobre ese recurso porque no tiene flags de entrada / salida definidos... para saber el comportamiento concreto toca mirar la documentación de la STL.
En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: fstream y fopen y sus modos
« Respuesta #4 en: 14 Abril 2014, 19:03 pm »

Gracias voy a intentar a seguir mas orden cuando escribo el código  ;D

Citar
El problema es que con ate no indicas si vas a leer o escribir... en este caso la función puede que haga uso del mecanismo por defecto
En la STL pone que en ofstream out siempre esta definido, por lo tanto supongo que ate también es out.

Antes me dijiste que out es para escribir y in para leer pero entonces porque se produce esto:

Código
  1. Sobrescribe todo: ofstream file(fName,ios::binary);
  2. Sobrescribe todo: ofstream file(fName,ios::binary | ios::ate);
  3. Sobrescribe todo: ofstream file(fName,ios::binary | ios::ate | ios::out);
  4. Funciona bien: ofstream file(fName,ios::binary | ios::in);

Al usar in con ofstream que se para escribir y in es para leer funciona bien pero en los otros casos no. Porque ??

Perdón si soy muy pesado pero no me queda claro. Gracias por tu paciencia.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: fstream y fopen y sus modos
« Respuesta #5 en: 15 Abril 2014, 08:43 am »

En la STL pone que en ofstream out siempre esta definido, por lo tanto supongo que ate también es out.

Ese valor por defecto lo vas a encontrar siempre y cuando no lo sobreescribas.

Si tu estableces una opción personalizada para abrir un archivo, esta nueva configuración va a sustituir a la que viene por defecto.

Antes me dijiste que out es para escribir y in para leer pero entonces porque se produce esto:

Es sencillo. Para escritura, el flag que permite actualizar es ios::app ( "app" de "append" ). Cualquier intento de abrir un fichero para escritura sin la opción "app" provoca el borrado del contenido del fichero, ya que no has indicado que quieres conservar el contenido.

La última opción te mantiene el contenido del archivo porque lo has abierto en modo lectura... obviamente si quieres leer el contenido no queda bien que la librería te lo borre.
En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: fstream y fopen y sus modos
« Respuesta #6 en: 15 Abril 2014, 11:05 am »

Citar
Si tu estableces una opción personalizada para abrir un archivo, esta nueva configuración va a sustituir a la que viene por defecto.
Citar
La última opción te mantiene el contenido del archivo porque lo has abierto en modo lectura... obviamente si quieres leer el contenido no queda bien que la librería te lo borre.
Si utilizo ofstream para escribir pero sustituyo la opcion por defecto out por in no deberia de poder leer ni escribir ya que no tiene permisos para escribir ni funciones para leer ya que es ofstream y no ifstream.
Código
  1. ofstream("file",ios::binary | ios::in);
  2.  
Esto funciona como si tiene append asignado pero sin haberle puesto permisos o modos para escribir.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: fstream y fopen y sus modos
« Respuesta #7 en: 15 Abril 2014, 11:15 am »

Esto funciona como si tiene append asignado pero sin haberle puesto permisos o modos para escribir.

Yo no se hasta que punto ese código supone una solución portable...

Con esto quiero decir... es posible que con un compilador diferente ( usando el mismo SO ) el resultado final sea distinto.
« Última modificación: 15 Abril 2014, 11:34 am por eferion » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: fstream y fopen y sus modos
« Respuesta #8 en: 15 Abril 2014, 13:00 pm »

Si utilizo ofstream para escribir pero sustituyo la opcion por defecto out por in no deberia de poder leer ni escribir ya que no tiene permisos para escribir ni funciones para leer ya que es ofstream y no ifstream.

ios::out es una opción que tiene ofstream por defecto. No estas sustituyendo el ios::out por el ios::in, simplemente estás agregando el ios::in, por tanto, seguirá con permiso de escritura.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda fopen() y modos de apertura
Programación C/C++
cgvwzq 8 7,411 Último mensaje 7 Mayo 2010, 00:25 am
por Littlehorse
Problema con eof, de fstream
Programación C/C++
arcanu 0 2,795 Último mensaje 22 Noviembre 2010, 05:31 am
por arcanu
Practicando con fstream
Programación C/C++
anonimo12121 3 2,990 Último mensaje 3 Abril 2011, 17:17 pm
por anonimo12121
fstream.h
Programación C/C++
laephy 1 6,338 Último mensaje 13 Abril 2011, 23:40 pm
por ssaammuu
Problema con fstream en c++
Programación C/C++
anamnesis_92 5 4,079 Último mensaje 14 Febrero 2012, 11:58 am
por anamnesis_92
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines