Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Escribir en ficheros

Estas en el tema de Escribir en ficheros en el foro de C/C++ en Foros del Web. Hola, estoy haciendo un programa en c++ y una de las cosas que quiero hacer es la siguiente: Imaginaos que hay 5 Threads funcionando al ...
  #1 (permalink)  
Antiguo 01/02/2012, 11:39
 
Fecha de Ingreso: agosto-2010
Mensajes: 14
Antigüedad: 13 años, 8 meses
Puntos: 0
Escribir en ficheros

Hola, estoy haciendo un programa en c++ y una de las cosas que quiero hacer es la siguiente:
Imaginaos que hay 5 Threads funcionando al mismo tiempo, y cada uno de ellos puede escribir cuando quiera en un fichero llamado "fichero.txt". Al principio de la ejecución, cada Thread escribe en ese fichero su nombre y su id en distintas filas, por ejemplo:
nombre=Thread1
id=1
Por lo que en un momento de la ejecución, si todos los Thread han escrito por lo menos una vez en el fichero, el archivo quedaría así:
nombre=Thread1
id=1
nombre=Thread2
id=2
nombre=Thread3
id=3
nombre=Thread4
id=4
nombre=Thread5
id=5
Ahora, si durante la ejecución, cada Thread quiere leer su nombre y su id para cambiarlo, ¿cómo puedo hacerlo sin borrar lo que ha escrito otro Thread y reemplazar sólo lo que ha escrito este Thread anteriormente por lo nuevo que quiere escribir? Por ejemplo, si ahora el Thread2 quiere escribir su nombre como Thread6 y su id por 6, tendría que quedar así:
nombre=Thread1
id=1
nombre=Thread6
id=6
nombre=Thread3
id=3
nombre=Thread4
id=4
nombre=Thread5
id=5
Yo he hecho algo así, pero no me funciona:
Para escribir en el fichero (nombreThread contiene el nombre y idThread contiene el id):
fstream f1;
f1.open("fichero.txt", ios::out | ios::app);
sprintf(nombre, "%s%d","nombre=", nombreThread);
sprintf(nombre1, "%s%d","id=", idThread);
// si es el Thread1 el que escribe, escribirá en las dos primeras filas
// si es el Thread2, saltará dos saltos de linea y escribirá en las siguientes
// y así sucesivamente
for(int p=1; p<idThread; p++) {
f1.getline(text, '\n');
f1.getline(text, '\n');
}
f1.write(nombre, 14);
f1 << endl;
f1.write(nombre1, 9);
f1 << endl;
f1.close();
Alguien me podría ayudar? Gracias!!
  #2 (permalink)  
Antiguo 01/02/2012, 22:03
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: Escribir en ficheros

Hola, creo que en vez de utilizar el sistema que estas llevando a cabo podrías utilizar CSV, que usa comas como separador, por ejemplo:

fichero.txt

Código:
// nombreThread1, idThread1, nombreThread2, idThread2, nombreThread3, idThread3 ...

Thread1,1,Thread2,2,Thread3,3
Y en caso de que quieras modificar un valor, solo debes encontrar el índice de la posición de la coma numero 2 y 3, entre las cuales se encuentra el nombre del Thread2 y puedes cambiarlo por Thread6, por ejemplo.

Otra forma es utilizando archivos de configuración:

fichero.ini

Código:
[FICHERO]
nombre1=Thread1
id1=1
nombre2=Thread2
id2=2

// Etc.
Para este sistema debes utilizar las apis de windows (si es que utilizas) GetPrivateProfileString (para leer un valor como nombre2) y writeprivateprofilestring (para escribir un valor en alguna variable como id1).

Creo que estas son las mejores maneras, más cómodas y sencillas ;)

Espero haberte ayudado.

  #3 (permalink)  
Antiguo 02/02/2012, 05:09
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Escribir en ficheros

Si cambias de nombre o id igualmente sigues sabiendo en que posicion tienes que escribir??

Por ejemplo si cambias de id 2 al 9...ese dos lo sigues teniendo para saber donde escribir?

Este tipo de archivo se modifica creando un archivo temporal. Lees las primeras (n-1) * 2 lineas y las escribes en un archivo temporal. Luego escribes las lineas modificadas.
Y luegos terminas de leer y escribir todo.
Cuando terminas borras el viejo archivo y lo renombras al nuevo.

Como manejas thread deberias tener cuidado con la concurrencia.

Saludos

Etiquetas: fichero, ficheros, funcion, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:52.