[C con Clase] Problema al leer datos de un documento externo al programa

Steven Davidson srd4121 en njit.edu
Mie Abr 18 01:04:16 CEST 2012


Hola Marcos,

On 4/17/2012 4:43 PM, Marcos Collado Martín wrote:
> Hola Steven, me ha vuelto a surgir otra duda, que es tontisima pero
> que no le encuentro solución :S
>
> Lo que intento es que al final de cada "variable" por asi decirlo,
> deje un hueco entre ellos, que se el mismo (\t), el caso que he
> intentado es poner al final de la cadena \t pero no lo lee ya que
> entre medias hay 0s se supone no? Es decir, si yo tengo:
>
> char  cadena[30];
> si meto en la cadena "Hola"  solo me ocupa hasta la posicion 3 (0-3),

Bueno, hasta el índice 4 porque se agrega el carácter nulo.

> entonces hasta la posicion 29 que es donde pongo el \t todo eso que
> son? NULL, 0?
>

No. Lo que hay entre el priemr carácter nulo y el final del array es 
"basura". Es decir, valores arbitrarios que se interpretan como caracteres.

Si inicializas el array, como tal, entonces puedes forzar que todos los 
elementos sean ceros. Por ejemplo,

char cadena[30] = { 'H', 'o', 'l', 'a' };

Por defecto, los demás caracteres son inicializados a 0 (cero), que en 
este caso representan caracteres nulos.

> te dejo el codigo para que lo mires y me corrigas, que seguro que se
> puede hacer mucho mas simple que como lo estoy haciendo yo:
> http://paste2.org/p/1983653
>

Para solucionar tu problema, no intentaría modificar estas variables. 
Simplemente escribe el carácter '\t' directamente al fichero. Por ejemplo,

char producto[4];

producto[0] = 'A' + rand() % 26;
producto[1] = '0' + rand() % 10;
producto[2] = '0' + rand() % 10;
producto[3] = 0;

fprintf( archivo, producto );
fputc( '\t', archivo );

O también puedes usar 'fprintf()',

fprintf( archivo, "%s\t", producto );

Esto es parecido a lo que hiciste con el valor inicial de "stock" y 
unidades vendidas:

fprintf( fichero, "0\t" );
fprintf( fichero, "0\t" );

De hecho, sugiero usar una sola función 'fprintf()' en lugar de varias; 
debería ser más rápido,

fprintf( fichero, "%s\t%s\t%s\t0\t0\t", nombre, preciosCompra, 
preciosVenta );

También puedes usar 'fputs()' en estos casos; esto es,

fputs( nombre, fichero );
fputs( "0\t", fichero );

fputs( preciosCompra, fichero );
fputs( "0\t", fichero );

fputs( preciosVenta, fichero );
fputs( "0\t", fichero );

Consulta la referencia de <stdio.h> (o <cstdio> en C++) en nuestra 
página yendo a: http://c.conclase.net/librerias/?ansilib=stdio#inicio


- Ciertamente, no es aconsejable asignar '\t' al final del array, porque 
seguramente será ignorado. Recuerda que las cadenas comienzan desde el 
principio del array hasta el primer carácter nulo. Por lo tanto, lo más 
seguro es que nunca llegue al final. Si la cadena llena el array, 
entonces el último carácter es el nulo, y al asignar '\t' reemplazas tal 
carácter nulo. Esto provocaría un acceso a memoria que no pertenece a 
este array, porque el comportamiento típico de las funciones continuar 
accediendo (leyendo o escribiendo) hasta encontrar el primer carácter nulo.

Lo que interesaría hacer es guardar '\t' al final de la cadena, no del 
array. Como sobreescribirías el carácter nulo, tendrás que volver a 
colocarlo.

- Nuevamente, te adiverto que invoques 'srand()' UNA SOLA VEZ en tu 
programa, no por función, sino por programa. por eso dije que la 
invocaras nada más empezar en 'main()'. Después no la vuelvas a invocar.


Espero que esto aclare las dudas.

Steven





Más información sobre la lista de distribución Cconclase