Problema C :/

Gandalf530

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int devuelve (FILE *f);
int lee(FILE *f);
int borra(FILE *f, char *argv[]);
int main(int argc, char *argv[])
{
FILE *f;

printf ("MENU");

if (!strcmp(argv[1], "-b")){
printf ("borrado de %s", argv[2]);
borra(f, argv[2]);
}

else {
printf ("Introduce los datos que desees: \n");
devuelve(f);
printf ("El resultado es\n");
lee(f);
}
//Funcion introduccion y ver datos y borrar datos introducidos por teclado y guardados en un fichero
}

int devuelve (FILE *f)
{
int car;
f=fopen("escribe.txt","w");
while ((car=fgetc(stdin))!=EOF) fputc(car,f);
fclose(f);
}

int lee(FILE *f)
{
int car;
f=fopen("escribe.txt","r");
while ((car=fgetc(f))!=EOF) fputc(car,stdout);
fclose(f);
}

int borra(FILE *f, char *argv[])
{
FILE *g;
f=fopen("escribe.txt","r");
g=fopen("prueba.txt","w");
int car;
car=fgetc(f);
while (car!=EOF){
if (!argv[2]==car){
fputc(car,g);
car=fgetc(f);
}
else
car=fgetc(f);
}
fclose(f);
fclose(g);
rename ("prueba.txt", "escribe.txt");
remove ("prueba.txt");
}

El error me da en la linea que esta en negrita y no se porque :/

PD: (No se si la funcion de borrar me va bien ya que como me ha dado ese error no la he podido probar)

PD2: No insultos no soy muy ducho en C xdd

R

asi a simple vista diria que la variable car tendria k estar encima de las igualaciones g=fopen .. y f=fopen tambien creo que deberia de ser char en vez de int

no tengo ningun compilador instalado prueba de cambiar eso .. a ver

Gandalf530

No eso esta medianamente bien, o al menos me lo reconoce bien el compilador, el error esta en la linea en negrita, o eso creo :/

maRc

Si dices el error...

gF

La verdad es que no se exactamente pq te da error ahí, a mi con el Visual Studio me da el primer error 2 lineas más abajo, pq la función borra está mal declarada.

De todas formas si te digo que yo lo haría de otra forma para procesar la cadena de entrada, yo la rompería con "strtok()" y analizaría parámetro por parámetro.

Aparte de eso, en la función borra, hay errores gordos:

if (!argv[2]==car){

tu no puedes hacer eso ya que argv[2] es un 'char*' y car es un 'int', primero deberias hacer:

numero=atoi(argv[2])

y luego if(numero!=car)...

En fin repasate el código pq esta bastante verde, mirate lo de "strtok()" para procesar primero la cadena de entrada y luego ya hablamos del resto, saludos

Gandalf530

vale gracias como te dije no revise apenas lo de borrar, lo hice en dos minutos pero aun asi soy un perry en C.

La funcion strtok no la conocia le hechare un ojo ;D

Gracias

gF

De nada, por cierto, parece que te enganxe bien a OTH eh, jajaja, vaya 4ª temporada diosssss...

maRc

La variable **argv ya está "partida", cada una de las posiciones de la matriz apunta a una única cadena (cada argumento), por lo que usar la strtok es una tontería.

gF

lo sé, pero es que no me explico ese error, a mí el compilador no me lo dá, por eso digo que pruebe lo otro...

maRc

A mi con el gcc me va perfectamente.

Si es lo que me imagino, el problema lo tienes cuando llamas al programa sin argumentos, que te da violación de segmento, ¿no?

Tienes que comprobar cuantos parámetros te han pasado antes de intentar acceder a ellos, con la variable argc, que te devuelve su número. Luego en la **argv van desde argv[0] hasta argv[argc-1].

javithelong

No se si lo has resuelto, pero vamos, lo que dicen arriba es correcto, comprueba el parametro argc, y si es correcto, ya accedes a argv, que sino te dará violación de segmento.

Como curiosidad, te diré que tu programa admitirá como -b cualquier cosa que empiece por -b esto es

./nombreprograma -b
hará lo mismo que
./nombreprograma -borra
y lo mismo que
./nombreprograma -basdfgh

No he mirado el resto del código, pero vamos, si solucionaste el problema, esto no tiene más interés.

Saludos

Usuarios habituales