Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Flakito81

#11
La verdad es que estoy un poco desentrenado con el C, pero echando una vista rápida veo lo siguente:

1- Al final del while tienes un ';' eso quiere decir que leera el fichero hasta acabar y listo
2-Suponiendo que

.........printf ("\n");
.........i=1+1;

En realidad quiera decir

.........printf ("\n");
.........i=i+1;

Nota: Ver que 1+1 es 2 siempre y no tiene ningun sentido.
2.1- La función His() tiene dos getc ¿para qué?
2.2- Las funciones Cien(), depor(), geo()

while(i<=5)
{
...while((w=getc(doc)) != EOF);
...if (w =='\n')
......{
.........printf ("\n");
.........i=1+1;
......}
...else printf("%c",w);
}

Si analizas un poco ese código veras que hace la primera iteración porque i<=5, i = 1. Luego leerá todo el fichero hasta el final y pueden ocurrir dos cosas:
a) Que hacen menos de 5 saltos de linea y vuelva a iterar para leer un fichero cuyo puntero está al final
b) Que hayan 5 o mas saltos de linea y no haga nada
En cualquiera de los casos no tiene sentido
3- Hay variables que no se usan
4- Usas C, pero tienes cabeceras y espacios de nombres del C++. Deberias de decidir en que lo vas ha hacer.
5- conio.h es lo peor de lo peor. Exceptuando que te obliguen a usar algún compilador obsoleto como Turbo C no deberias de emplearla.

Consejos:
1- Ya que estas usando llamadas al sistema ....

printf("Presione cualquier tecla para escoger su categoria");
getch();

Sustituyelo por un system("pause"); si quieres adecua el mensaje para que tenga sentido

2- Cuando ejecutes el programa hazlo desde la consola y no desde el compilador así cuando acabe la ejecución no perderas la ventana del entorno y puedes evitar algunos "pause"

3- Al menos hasta que no sepas que te funciona correctamente coloca los ficheros en la misma carpeta donde se encuentre el ejecutable

4-

if (w =='\n')
{
...printf ("\n");
...i=i+1;
}
else
... printf("%c",w);


Es equivalente a:

printf("%c",w);


En el caso de que estes contando los saltos de linea por alguna razón:

if (w =='\n')
...i++;
else
... printf("%c",w);


5- La lectura del fichero deberá de ser algo como

while((w=getc(doc)) != EOF);
{
...printf("%c",w);
}
fclose(doc);


6- Imaghino que al hacer el codigo te habras dado cuenta que las funciones son muy parecidas, por no decir iguales, a excepcion del fichero que abres. La prueba es que hiciste una y el resto es un copia pega. Mi propuesta es que no te compliques que trabajes lo menos posible siempre que puedas, que simplifiques las cosas.
Haz una sola funcion a la que le pases el nombre del fichero y la llames las veces que necesites con el argumento (nombre del fichero) necesario.
La funcion quedaría tal que:


int Funcion(char *fichero, char *categoria)
{
...int x,i=1,w;
...system ("cls");
...printf("\n <===============Su categoria es %s===============> \n", categoria);
...system("pause");
...doc = fopen(fichero,"r");
/** Resto del código **/


Obviamente la llamada seria tal que:

Funcion ("historia.txt", "Historia");


Y por supuesto se puede hacer más profesional, pero siempre hay que empezar por lo básico la experiencia es lo que necesitas
En realidad tampoco te puedo decir mucho más porque no sé que quieres hacer ni cual va a ser la escructura del fichero ni nada
#12
Hola !!

No he compilado tu código asi que lo que te puedo decir son los errores que saltan a simple vista.

1- Por simple estética deberías de usar C o C++ porque si mezclas las cosas no solo estás haciendo el código sino que desaprovechas las funcionalidades del C++.

2- regis no es un tipo de dato, asi que tienes dos opciones:
2.1 haces que sea un tipo de dato con algo como:
typedef struct regis tiporegistro;
y luego declaras las variables como:
tiporegistro registro;
2.2- declaras las variables de esa estructura:
struct regis registro;

3- string no es un tipo de dato sino una clase asi que te recomiendo que uses char *dato, o bien char dato[TAMANYO]

4- Si tienes la variable registro en la función menu es para usar esa información en cualquier parte, por tanto utiliza las referencias en vez de retornar el valor (funcion registrarse). Es más si quieres asignar el valor retornado a tu variable registro tendrás que retornar el puntero, o bien sobrecargar el operador asignación. Date cuenta que registro es una variable definida por ti asi que el compilador no tiene ni idea de lo que hacer.

5-
   memset(buffer,0,BUFFER);
   strcat(buffer,nombre);
   strcat(buffer,exten);

Todo eso lo podrías ahorrar empreando la función sprintf o bien concatenando las diferentes cadenas en una variable del tipo string y luego usar el método c_str() para transformarlo a char *.

6-
fread(&recuperar,sizeof(regis),1,fichero);
printf("\n Contenido del Fichero: \n\n");
while(!feof(fichero)){
....cout<<"Nombre: \t"<<recuperar.nombre<<endl;
....cout<<"Contraseña: \t"<<recuperar.contra<<endl;
FALTA OTRO FREAD
}
Si te das cuenta cuando entras en el bucle no lees mas del fichero por tanto el puntero no avanza y nunca llegará al final del fichero.
Date cuenta que en sizeof pasa lo mismo que lo mencionado en el punto 2

7-
void almacenar(FILE *fichero,char buffer[],regis *registro){
....if((fichero = fopen(buffer,"w")) != NULL ){
........printf("Creado Con exito...\n");
........fwrite(&registro,sizeof(regis),1,fichero);
........fclose(fichero);
....}else{
....printf("Error al Crear fichero...\n");
....}
}
7.1 Pasarle a la funcion el puntero al fichero (FILE*) sobra. Incluso podrías mejorar la funcion guardar y almacenar considerando abrir para añadir al final (fopen("nombre","a"))
7.2 regis tiene el mismo inconveniente que lo comentado en el punto 2, además le estas pasando un puntero, por tanto el ampersand de fwrite sobra.

8- Un problema capital. No puedes estar llamando a la funcion menu desde la propia funcion menu, eso es hacer llamadas recursivas, es decir, que en la pila del sistema estas guardando una copia de todas las variables, direcciones, etc por cada llamada, ademas usar exit no está bien, de hecho si usas exit nunca saldrá de main sino que cierras el programa, dicho de otra manera no regresará a la funcion principal. Una solucion es hacer un bucle, algo como

<declaracion de la variable>
do{
<tu codigo pero sin las llamadas recursivas>
}while (elegir != 4);


Suerte!!
#13
Programación C/C++ / Re: Amigos ayuda urgente
30 Julio 2011, 00:15 AM
Hay varios errores:

1- el prototipo de la funcion debe de ser int main(), fácilmente deducible si estas retornando un cero.
2- En el bucle anidado hay un error xq estas usando la variable matriz como si fuera unidimensional, pero lo has declarado bidimensional. No tiene sentido
3- En el último for hay varios errores:
3.1- No tiene sentido hacer i +j si j = 0 y nunca cambia, dicho de otra manera con poner i tienes.
3.2- El printf está mal escrito. lo correcto es printf ("%d\n", matriz[2-i]); [fijate en las comillas]

Lo que hace la ultima parte es recorrer la diagonal principal de la submatriz de 3x3, pero comenzando desde el elemento inferior, es decir:
[0-2]
[1-1]
[2-0]

NOTA: el error 2 lo puedes corregir poniendo: matriz[j]= i+j;

Suerte!!
#14
Scripting / Re: Duda en bash
13 Abril 2010, 22:31 PM
Muchas gracias por responder ^Tifa^!!

Cierto es que no he explicado todo el problema. Te comento brevemente el script:
Lo que pretende es que pasado un directorio muestre cuantos archivos tiene ese directorio con el tamaño real, fisico, ... si tiene subdirectorios que entre en ellos y haga lo propio y finalmente me va a quedar una serie de filas con el la ruta del directorio/subdirectorio y la información antes mencionada y, además, la suma de todas ellas. Algo asi:

Path                                        T-Real  T-Fisico  N-Archivos
/home/Flakito81/directorio         1200     4096      13
/home/Flakito81/directorio/a      23        4096        1
/home/Flakito81/directorio/a/b   0          0             0
/home/Flakito81/directorio/otro  560      4096        3
Total                                        1783   12288      17


Obviamente como se puede intuir es una funcion recursiva.

El tema de ls  -sh   fichero lo contenplé pero no me sirve xq las cantidades están en diferentes unidades. Lo que si me interesa y quizas lo haga es hacer ese cambio de unidades para que sea más entendible, pero por ahora solo sabría hacerlo en la suma final .

Por ello opté por lo siguiente: (espero optimizarlo más, pero mi mente piensa en C :) )
Código (bash) [Seleccionar]

BLOCK=$(stat -c "%B" $0);
for f in `stat -c "%b" * | grep -v ^d |awk '{print $1}'`; do
       fsize=$((fsize+(f*BLOCK)))
done


Un abrazo!!! :P

PD: Disculpa como se muestra lo que debería ser la salida del script pero cuando he posteado lo alineé todo.

PD: Quizas esta semana muestre el código, junto con otro que tmb dije que subiría
#15
Scripting / Re: Duda en bash
13 Abril 2010, 00:34 AM
Hola ^Tifa^  cuánto tiempo!! :)

El post me quedó incompleto porque me faltó incluir que no puedo usar el du xDD

Me he puesto a investigar por las opciones del ls y de los diferentes comandos, en especial del stat y he observado lo siguiente:

Código (bash) [Seleccionar]

ls -ls [archivo | directorio]

Me muestra en la primera columna el tamaño en bloque, que viene a coincidir con lo que me da el du

Código (bash) [Seleccionar]

stat -c "%b %B" <archivo | *>

Me da el numero de bloques del archivo y el tamaño de cada bloque, por lo que multiplicando llegaría al mismo resultado (exceptuando las unidades, pero que es fácil de solucionar).

Muchas gracias por responder y espero que si existe alguna corrección la comenten :)
#16
Scripting / Duda en bash
12 Abril 2010, 20:02 PM
Hola a tod@s!!!

Mi duda es "simple" ¿cómo puedo saber el espacio físico que ocupa un fichero en disco? No el valor que da ls -l, wc -c, stat -c %s, ... sino el físico.

He pasado buena parte de la tarde de ayer intentando solucionarlo y no hay manera.

Gracias!!
#17
Scripting / Re: Ordenar usuarios en Bash
6 Abril 2010, 01:51 AM
Para empezar te quiero dar las gracias Leo no sólo por responder sino porque me ayudaste bastante.

Recien estoy comenzando a hacer scripts en bash muy simples y no domino todos los comandos, de hecho el awk lo había visto escrito por ahí  pero no sabía para que era.

En cuanto a que no entendias no me extraña porque leyendo ahora mi propio post me cuesta entenderme a mi mismo xDD. Pero te explico lo que quería hacer, e hice:
La idea era crear un script que listara el numero de procesos de cada usuario (conectados a un servidor), junto con su login y con stime mas antiguo de sus procesos (todo ello ordenado en orden descendente por numero de procesos) . Opcionalmente quería ponerle dos opciones tan sencillas como inutiles:
1- informar al usuario que ha superado el número de procesos asignados
2- matarle procesos hasta que esté dentro del limite

Obviamente sé que lo segundo es inviable porque se pueden matar procesos importantes. Y lo primero un poco también porque si tiene desactivado los mensajes el write no funciona.


Ese era todo mi problema, el script lo tengo hecho y lo postearé el viernes probablemente.

Lo dicho muchisimas gracias por la ayuda.

PD: Ya se que existe el comando ulimit 
#18
Hola gente!!

Mi pregunta es simple, pero que soy incapaz de dar con la solución:

¿Cómo puedo ordenar los usuarios logeados por los procesos que tiene abierto?

Hasta ahora para conseguir los usuarios hago algo tal que:
Código (bash) [Seleccionar]

who | cut -d ' ' -f1 | sort -u

Guardo la salida en un array y con un for lanzo un ps -Af (seleccionado las columnas que me interesan) le pongo el grep $i y finalmente hago otro ps similar al anterior y cuento las lineas (wc -l) para saber el numero de procesos.
La salida me viene quedando:
USER  STIME PROCESOS

(Donde el usuario solo se muestra una vez (uso el head para ello))

El tema es que no puedo ordenar esas filas por numero de procesos porque pertenecen a dos comandos diferentes y no lo puedo hacer en uno (al menos no se como) xq si uso el wc -l solo me va a sacar el numero de procesos y ninguna otra informacion.
La unica solucion que se me ocurre es que los usuarios ya esten ordenados en el array por el numero de procesos, pero no sé como.

Espero que me podais ayudar!!

Gracias!
#19
Con inicializar la vble seguir una sola vez (antes de entrar al bucle basta), tan solo cambias el estado cnd tenga que salir, el problema, quizas, está en el while que tienes while (seguir=true) cuando lo correcto sería while(seguir==true) o while(seguir)

Suerte!
#20
Java / Re: Program java numeros primos
15 Noviembre 2008, 01:20 AM
Yo sinceramente dudo que eso funcione, y que conste que no lo he probado. Aparte del problema con el tipo de datos con la variable es_primo que ya comentó WannaBeHacker, veo el siguiente trozo que me llama la atención:
Código (java) [Seleccionar]

if (numero % j == 0) {
    es_primo==false;

     j = j + 1;
}

según eso la variable j no se incrementa al no ser que el numero sea no_primo, y para ser más concreto, j no se incrementa si el numero es diferente de multiplo de dos. Lo correcto sería tener el if sólo para cambiar el estado de la bandera (es_primo) y la j se incrementa siempre o si te gusta liar mas el codigo pones un else e incrementas la j. Sin salir de ese trozo de código recordarte algo básico casi que del prescolar de la programacion:
= asignacion
== comparacion
asi que es_primo == false no es correcto. Al igual que if (es_primo = true) tmp lo es
.Lo dicho, corrige eso y pon más atención ;)


Saludos!

PD: mira el abre llave del while que WannaBeHacker lo elimino sin querer