signal SIGSEGV, Segmentation fault. In fwrite () (/lib/tls/i686/cmov/libc.so.6)

hello guys! first of all I am new to this, I commented the program be able to enter data, display, search and remove, the first program features work well (can be improved obviously) but I can not remove ... and this is the error that pulls at run time because there are no errors when compiling


Program Received signal SIGSEGV, Segmentation fault.
In fwrite () (/ lib/tls/i686/cmov/libc.so.6) segfault


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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;



int main()
{
    struct{
        char nombre[30];
        int cds;
        char comentarios[50];
        int numero;
    }datos;
    FILE*puntero, *tmp;
    int i=0, num,opcion;
    int ok=0;


    while(1){
        cout<<"\n\nINGRESE OPCION A USAR: \n\n";
        cout<<"\t\t AGREGAR DATOS (1).\n";
        cout<<"\t\t VER LISTA COMPLETA (2).\n";
        cout<<"\t\t BUSCAR DATO (3).\n";
        cout<<"\t\t BORRAR DATO (4).\n";
        cout<<"\t\t SALIR (5).\n\n";
        cout<<"\t\t Opcion:  ";
        cin>>opcion;

        if(opcion <1 || opcion >5){
         cout<<"\n\n TENES OPCIONES DEL 1 AL 5 BOLUDO\n\n";}

        if(opcion==5){
            cout<<"FIN DEL PROGRAMA";
            cout<<"\n5...";
            sleep(1);
            cout<<"\n4...";
            sleep(1);
            cout<<"\n3...";
            sleep(1);
            cout<<"\n2...";
            sleep(1);
            cout<<"\n1...";
            sleep(1);
            return 0;

            }



    switch( opcion)
    {
    case 1: 
    if ((puntero =fopen("BASE_DE_DATOS.DAT","a+b"))==NULL){
        printf("\n NO SE PUEDE ABRIR UN EL ARCHIVO.");
        return 1;
    }

    while (1)
    {
        fflush(stdin);
        cout<<"\n NOMBRE: ";
        cin>>datos.nombre;
        if(!strcmp(datos.nombre,"FIN"))
        {
            return 0;
        }
        fflush(stdin);
        cout<<"\n CD'S: ";
        cin>>datos.cds;
        cout<<"\n COMENTARIOS: ";
        cin>>datos.comentarios;
        fflush(stdin);
        cout<<"\n NUMERO: ";
        cin>>datos.numero;
        fflush(stdin);
        fwrite (&datos,sizeof(datos),1,puntero);
    }
    fclose(puntero);

    ;break;
    case 2:
        if ((puntero =fopen("BASE_DE_DATOS.DAT","rb"))==NULL){
        printf("\n NO SE PUEDE ABRIR UN EL ARCHIVO O NO EXISTE.");
        return 1;
    }
    fseek(puntero,0,SEEK_SET);
    fread(&datos,sizeof(datos),1,puntero);
    printf("\n %s %10s %10s %20s", "NUMERO", "NOMBRE", "CDS", "COMENTARIOS");
    while(!feof(puntero)){
        printf("\n %d %10s %10d %20s",datos.numero,datos.nombre,datos.cds,datos.comentarios);
        fread(&datos,sizeof(datos),1,puntero);
    }
    fclose(puntero);
    ;break;

    case 3:
     if ((puntero =fopen("BASE_DE_DATOS.DAT","rb"))==NULL){
        printf("\n NO SE PUEDE ABRIR UN EL ARCHIVO O NO EXISTE.");
        return 1;
    }
    cout<<"\n BUSCAR POR: ";
    cout<<"\n NOMBRE (1)"; 
    cout<<"\n NUMERO (2)";// FUNCTION NOT READY
    cout<<"\n\n OPCION: ";
    cin>>opcion;
    fseek(puntero,0,SEEK_SET);

    char charaux[30], charaux2[30];
    if(opcion==1){
        cout<<"\n INGRESE NOMBRE: ";
        scanf("%s",&charaux);
        while (!feof(puntero)){
                fread(&datos,sizeof(datos),1,puntero);
                if(!strcmp(datos.nombre,charaux)){
                printf("\n %s %10s %10s %20s", "NUMERO", "NOMBRE", "CDS", "COMENTARIOS");
                printf("\n %d %10s %10d %20s",datos.numero,datos.nombre,datos.cds,datos.comentarios);
                ok=1;}
                if(ok!=1){
                strcpy(charaux2,datos.nombre);
                if(charaux2[0]== charaux[0]){
                    if(charaux2[1]==charaux[1]){
                        if(charaux2[2]== charaux[2]){
                                printf("\n %s %10s %10s %20s", "NUMERO", "NOMBRE", "CDS", "COMENTARIOS");
                                printf("\n %d %10s %10d %20s",datos.numero,datos.nombre,datos.cds,datos.comentarios);
                            }}}
                }}}
    fclose(puntero);
    ;break;
    case 4:
    cout<<"\n INGRESAR NUMERO A ELIMINAR: ";
    cin>>num;
    if ((puntero =fopen("BASE_DE_DATOS.DAT","rb"))==NULL){
        cout<<"\n NO SE PUEDE ABRIR UN EL ARCHIVO O NO EXISTE.";
        return 1;
    }

    if((tmp=tmpfile())=NULL){
        cout<<"\n ERROR EN APERTURA DE ARCHIVO TEMPORAL. ";
        return 1;
    } 
    fread (&datos, sizeof(datos),1,puntero);
    while(!feof(puntero)){
        fwrite(&datos, sizeof(datos),1,tmp);//apparently the error is in this line
        fread (&datos, sizeof(datos),1,puntero);
    }
    fclose(puntero);
    rewind(tmp);

    if ((puntero =fopen("BASE_DE_DATOS.DAT","wb"))==NULL){
        cout<<"\n ERROR EN REAPERTURA DE LA BASE DE DATOS.";
        return 1;
    }

    fread (&datos, sizeof(datos),1,tmp); 
    while(!feof(tmp)){ ";
            if(datos.numero!=num){ 
                fwrite(&datos, sizeof(datos),1,puntero);}
            fread(&datos,sizeof(datos),1,tmp);
             
    }
    fclose(puntero); 
    fclose(tmp); 

  break;

    }    }
    
    }
 





:)

thanks to all
Spanish! I haven't seen Spanish in this forum in ages!

&datos doesn't look right to me... what are you trying to do there?

-Albatross


You're lucky I found this by accident.

Line 140: if((tmp=tmpfile())=NULL){

This will always be false, since NULL == false, and you are making temp always NULL. Thus, when you use tmp later, it is NULL.
Last edited on
this is so embarrassing... hahah thanks firedraco !!!


greetings from Argentina
if((tmp=tmpfile())=NULL)


Yes, there's an old coding standard which puts NULL first to avoid this problem.

So, if you wrote
if(NULL=(tmp=tmpfile()))
the compiler complains since you can't assign to NULL.
Topic archived. No new replies allowed.