Dev - C++ - fstream seekp

 
Vista:
Imágen de perfil de Alfil
Val: 2.362
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

fstream seekp

Publicado por Alfil (620 intervenciones) el 29/12/2018 11:49:58
Estoy tratando de pasar este código de C a C++
El programa abre un archivo de acceso aleatorio y añade registros ordenados por el número de cuenta.
En C funciona perfectamente pero en C++ no consigo hacer funcionar la instrucción fs.seekp adecuadamente y escribe los nuevos datos siempre al final del fichero

Programa en C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
 
struct datosCliente {
    int numCta;
    char apellido[ 15 ];
    char nombre[ 10 ];
    double saldo;
 
};
 
int main()
{
    FILE *ptrCf;            // apuntador al archivo 
 
    // crea datosCliente con información predeterminada 
    struct datosCliente cliente = { 0, "", "", 0.0 };
 
    if ( ( ptrCf = fopen( "clientes.dat", "rb+" ) ) ==  NULL ) {
        printf( "El archivo no pudo abrirse.\n" );
    } else {
 
        printf( "Introduzca el numero de cuenta"
                " ( 1 a 100, 0 para terminar la entrada )\n? " );
        scanf( "%d", &cliente.numCta );
 
        while ( cliente.numCta != 0 ) {
 
            printf( "Introduzca el apellido, el nombre, el saldo\n? " );
            fscanf( stdin, "%s%s%lf", cliente.apellido, cliente.nombre, &cliente.saldo );
 
            // localiza la posición de un registro especifico en el archivo 
            fseek( ptrCf, ( cliente.numCta - 1 ) * sizeof( struct datosCliente ), SEEK_SET );
 
            // escribe en el archivo 
            fwrite( &cliente, sizeof( struct datosCliente ), 1, ptrCf );
 
            printf( "Introduzca el numero de cuenta"
                    " ( 1 a 100, 0 para terminar la entrada )\n? " );
            scanf( "%d", &cliente.numCta );
 
        }
 
        fclose( ptrCf );        // fcierra el archivo
 
    }
 
    return 0;
 
}

Programa en C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <fstream>
#include <iostream>
 
using namespace std;
 
struct datosCliente {
    int numCta;
    char apellido[ 15 ];
    char nombre[ 10 ];
    double saldo;
};
 
int main()
{
    // crea datosCliente con información predeterminada 
    struct datosCliente cliente = { 0, "", "", 0.0 };
 
   ofstream fs( "clientes.dat", ios::app | ios::binary);
 
             cout << "Introduzca el numero de cuenta"
             << " ( 1 a 100, 0 para terminar la entrada )\n? ";
        cin >> cliente.numCta;
 
        while ( cliente.numCta != 0 ) {
 
            cout << "Introduzca el apellido, el nombre, el saldo\n? ";
            cin  >> cliente.apellido >> cliente.nombre >> cliente.saldo;
 
            // localiza la posición de un registro especifico en el archivo
            fs.seekp( ( cliente.numCta - 1 ) * sizeof( datosCliente ) );
 
            // escribe en el archivo 
            fs.write( (char*)&cliente, sizeof( struct datosCliente ) );
 
            cout << "Introduzca el numero de cuenta"
             << " ( 1 a 100, 0 para terminar la entrada )\n? ";
 
            cin >> cliente.numCta;
 
        } // fin de while 
 
        fs.close();
 
    return 0;
 
}
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

fstream seekp

Publicado por Tom (55 intervenciones) el 29/12/2018 13:06:02
Bueno, tú estás haciendo que funcione asÍ:

ofstream fs( "clientes.dat", ios::app | ios::binary);

http://www.cplusplus.com/reference/fstream/ofstream/ofstream/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alfil
Val: 2.362
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

fstream seekp

Publicado por Alfil (620 intervenciones) el 29/12/2018 18:11:04
Muchas gracias, eso era, el modo de apertura del archivo.
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