Dev - C++ - Escribir en un lugar especifico en un archivo

 
Vista:

Escribir en un lugar especifico en un archivo

Publicado por Laterals (4 intervenciones) el 08/06/2017 13:47:10
Buenas, estoy haciendo un trabajo para la universidad y tengo que hacer un programa que gestione un parking.

Tengo que al añadir un vehiculo, se guarden sus datos en un txt acabado en un '-'

Ejemplo:

36
coche
0658FTY
Renault
Clio
12:02
8/6/2017
-
29
coche
3365BGT
Ford
Focus
12:03
8/6/2017
-

Lo que quiero hacer es que cuando al programa le indique que quiero retirar el vehiculo del parquing, añada un 1 al final, despues del '-'

O sea:
36
coche
0658FTY
Renault
Clio
12:02
8/6/2017
-1

Ya que no lo quiero borrar porque necesito tener un registro.

La cosa es que tengo esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(LeerRegistro.is_open()){
 
        LeerRegistro.getline(cadena,80,'\n');
        while (!LeerRegistro.eof()){
        if(strcmp(cadena, nPlazaBorrar) == 0){
                while(strcmp(cadena, "-") != 0){
                        LeerRegistro.getline(cadena,80,'\n');
                        cout<<cadena<<endl;
                }
        LeerRegistro<<'1';
        }
        else{
        LeerRegistro.getline(cadena,80,'\n');
 
        }
 
        }
 
 
}

Pero no me escribe nada al final, me gustaria saber posicionar el cursor justo despues del '-' para poder escribir el 1 despues. Ya he buscado y no me entero de nada.

A ver si podeis ayudarme.
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Escribir en un lugar especifico en un archivo

Publicado por agustin (522 intervenciones) el 09/06/2017 09:09:35
Eso no te va a funcionar jamás. C y C++ no permiten insertar en cualquier parte del archivo. Te preguntarás ¿entonces como lo hago? Hay varias formas.ñ:
1-Lees todo el contenido del archivo a un buffer en memoria hasta la posición donde deseas insertar algo, y en otro buffer por ejemplo lees el resto del archivo. Ya sólo quedaría concatenar todo y guardar todo concatenado en el archivo.
2-Hacer esto mismo pero usando un archivo temporal en vez de usar buffers.
3-Posicionarse en el archivo y leer a un buffer el resto del archivo, volver a posicionarse en el mismo lugar e insertar lo que desees y luego insertas lo que hay en el buffer.
4-Usar una estructura para que cada registro tenga siempre el mismo tamaño y así podrías en tu caso añadir un simple carácter solo con leer ese registro en concreto, volviendo a posicionarte en el y enviar el registro modificado con lo que ya se guardaría la modificacion.
Por ejemplo:
struct REG {
int id;
char tipo [10];
char matricula [10];
char marca [20];
char modelo [20];
struct tm; //aquí se guarda la fecha y hora
}reg;
Si usas buffers tendrás que usar memoria dinámica, calcular el tamaño del archivo y con algunos cálculos muy simples obtienes el tamaño del buffer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Escribir en un lugar especifico en un archivo

Publicado por agustin (522 intervenciones) el 09/06/2017 09:31:56
Perdón, se me olvido algo en la estructura:
1
2
3
4
5
6
7
8
9
struct REG {
    int id;
    char tipo [10];
    char matricula [10];
    char marca [20];
    char modelo [20];
    struct tm; //aquí se guarda la fecha y hora
    char guion [3];
}reg;

O:
1
2
3
4
5
6
7
8
9
struct REG {
    int id;
    char tipo [10];
    char matricula [10];
    char marca [20];
    char modelo [20];
    time_t tm; //aquí se guarda la fecha y hora
    char guion [3];
}reg;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Escribir en un lugar especifico en un archivo

Publicado por Javier (1 intervención) el 09/06/2017 11:18:51
Y has probado a hacer una modificación?

Quiero decir, en el primer caso (cuando el coche está dentro del parking) el txt de cada coche termina en -- (dos guiones) y al sacar el coche sustituyes el segundo guion por el número 1.

Seguramente sea mas facil
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Escribir en un lugar especifico en un archivo

Publicado por Laterals (4 intervenciones) el 09/06/2017 12:20:53
Pues no lo he probado pero el problema es el mismo no? Como me posiciono justo despues del segundo guion para borrarlo y poner algo nuevo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Escribir en un lugar especifico en un archivo

Publicado por Laterals (4 intervenciones) el 09/06/2017 12:19:33
Claro, obviamente ya tengo la estructura hecha, consiste en una matriz de 2d de tuplas como la que has puesto. La cosa es que no se como posicionarme en el archivo, se que existe la funcion seekg y seekp pero no consigo entender como funcionan.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Escribir en un lugar especifico en un archivo

Publicado por agustin (522 intervenciones) el 09/06/2017 13:36:20
Por lo que veo en tu ejemplo los ids no van en orden con lo que te toca abrir el archivo posicionándose al inicio y leer registro por registro hasta llegar al que tenga el dato que deseas modificar.
Al abrir un archivo con el parámetro por defecto te colocas al inicio y para colocarte una vez que está ya abierto:
1
out.seekp(0, ios::beg);
Si el id fuese incremental y en orden seria algo como:
1
out.seekp(sizeof (reg)*id, ios::beg);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Escribir en un lugar especifico en un archivo

Publicado por Laterals (4 intervenciones) el 09/06/2017 14:37:54
Segun he buscado el seekp funciona indicando numero de bytes, sin embargo eso depende del tamaño de la cadena de cada linea y eso puede variar. Lo que he intentado hacer es que lea hasta que encuentre el "-" y a continuacion escriba el 1, pero no me lo escribe justo despues sino varias lineas abajo:

Lo que quiero que haga es esto, por ejemplo si quiero retirar el coche 36:

36
coche
0658FTY
Renault
Clio
12:02
8/6/2017
-1 (el programa deberia poner el "1" aqui)
29
coche
3365BGT
Ford
Focus
12:03
8/6/2017
-

Pero lo que me hace es esto:

36
coche
0658FTY
Renault
Clio
12:02
8/6/2017
-
29
coch1 (me pone el "1" lineas mas abajo de donde deberia remplazando un caracter)
3365BGT
Ford
Focus
12:03
8/6/2017
-

Y el codigo es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(LeerRegistro.is_open()){
 
        LeerRegistro.getline(cadena,80,'\n');
    while (!LeerRegistro.eof()){
        if(strcmp(cadena, nPlazaBorrar) == 0){
                    LeerRegistro.getline(cadena,80,'\n');
                while(strcmp(cadena, "-") != 0){
                    cout<<cadena<<endl;
                        LeerRegistro.getline(cadena,80,'\n');
 
            }//Aqui acaba el while donde en teoria acaba de encontrar el "-", por lo que entiendo que el cursor está posicionado justo despues del    guión
            LeerRegistro<<"1";    //Aqui escribo el "1"
        }
        else{
        LeerRegistro.getline(cadena,80,'\n');
            }
 
                                }
 
 
                        }
 
}

Pero como he dicho me lo escribe más abajo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Escribir en un lugar especifico en un archivo

Publicado por agustin (522 intervenciones) el 10/06/2017 00:10:19
A ver, parece que no lo pillas. Tu me dices que lees una línea y que la línea puede variar de tamaño y yo te digo que uses una estructura y modifiques solo la variable que desees y la guardes. No necesitas buscar el guión para nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar