f.write y char(10)...

10/10/2003 - 16:58 por Jaime | Informe spam
En Windows, al escribir en un fichero "" se guardan
dos caracteres con los Ascii 13 y 10.
Ascii 13 = Carriage Return.
Ascii 10 = New line.

El problema es que si quiero escribir un char con el
valor 10, se escribe 13 y 10, en lugar de solamente el 10.

¿Hay alguna forma de que solo escriba el 10?

Por ejemplo:
{
ofstream f;
char c[10] = {1, 1, 1, 1, 1, 10, 1, 1, 1, 1};

f.open("prueba.dat");
f.write(c, 10);
f.close();
}

En este caso se escriben 11 chars en el fichero,
el 10 se escribe 13 y 10, con lo que al hacer un
f.read(c, 10) se destroza todo.

Si alguien conoce como hacer que solo se escriba el 10
le agraceria que respondiera ...

GRACIAS.

Preguntas similare

Leer las respuestas

#1 Marco A. Perez
11/10/2003 - 02:16 | Informe spam
Hola Jaime,

Abre tu archivo en modo binario, el default es modo texto
donde cada LF se sustituye por un CRLF:

f.open("prueba.dat", ios::out | ios::binary);

Saludos,
Marco.


En Windows, al escribir en un fichero "" se guardan
dos caracteres con los Ascii 13 y 10.
Ascii 13 = Carriage Return.
Ascii 10 = New line.

El problema es que si quiero escribir un char con el
valor 10, se escribe 13 y 10, en lugar de solamente el 10.

¿Hay alguna forma de que solo escriba el 10?

Por ejemplo:
{
ofstream f;
char c[10] = {1, 1, 1, 1, 1, 10, 1, 1, 1, 1};

f.open("prueba.dat");
f.write(c, 10);
f.close();
}

En este caso se escriben 11 chars en el fichero,
el 10 se escribe 13 y 10, con lo que al hacer un
f.read(c, 10) se destroza todo.

Si alguien conoce como hacer que solo se escriba el 10
le agraceria que respondiera ...

GRACIAS.


.

Respuesta Responder a este mensaje
#2 Jaime
11/10/2003 - 18:08 | Informe spam
Gracias por tu ayuda Marco, pero...

Si que funciona, pero en realidad yo no estoy escribiendo los
datos en un fichero, lo escribo en una Pipe que comunica al
Padre con el proceso Hijo.

Este Hijo envia datos al Padre por la STDout y lee por STDin,
es decir para leer hago:
cin.read( (char*)&buffer, sizeof(buffer) );
y para escribir:
cout.write( (char*)&buffer, sizeof(buffer) );

Aqui es donde tengo problemas con el char(10).

He probado a hacer:
cout.setf(ios::out | ios::binary);
cin.setf (ios::in | ios::binary);
pero no hace caso...

¿Como le se ponen las bandreras a una Pipe?
¿Como puedo hacer para que escriba en Binario en la Pipe?

GRACIAS.
Respuesta Responder a este mensaje
#3 KAKATUO
11/10/2003 - 20:24 | Informe spam
Creo que cin y cout estan predefinidos como canales de entrada y salida de
tipo texto.
Si quieres utilizar pipes en modo binario puedes crearlos tu mismo con:
int _pipe( int *phandles, unsigned int psize, int textmode );
Tendrás que seleccionar O_BINARY en textmode.

Espero que esto te sirva
Saludos


"Jaime" escribió en el mensaje
news:
Gracias por tu ayuda Marco, pero...

Si que funciona, pero en realidad yo no estoy escribiendo los
datos en un fichero, lo escribo en una Pipe que comunica al
Padre con el proceso Hijo.

Este Hijo envia datos al Padre por la STDout y lee por STDin,
es decir para leer hago:
cin.read( (char*)&buffer, sizeof(buffer) );
y para escribir:
cout.write( (char*)&buffer, sizeof(buffer) );

Aqui es donde tengo problemas con el char(10).

He probado a hacer:
cout.setf(ios::out | ios::binary);
cin.setf (ios::in | ios::binary);
pero no hace caso...

¿Como le se ponen las bandreras a una Pipe?
¿Como puedo hacer para que escriba en Binario en la Pipe?

GRACIAS.



Respuesta Responder a este mensaje
#4 Jaime
12/10/2003 - 01:38 | Informe spam
Gracias a todos... ya tengo la solucion:

Tras probar "nosecuantas" funciones he dado con
_setmode()
que permite ponerle las banderas a las pipes,
y por tanto solo he tenido que hacer:


#include <io.h>

int modo_binario = 0x8000;

_setmode(fileno(stdin), modo_binario);
_setmode(fileno(stdout), modo_binario);
-

¡Ya no hay problemas con el char(10)!!!

GRACIAS.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida