Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Duda Ejercicio de Manejo de Archivos
Autor Mensaje
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 269
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #1
Duda Ejercicio de Manejo de Archivos Ejercicios Informática I (Electrónica)
Hola gente, estoy repasando un poco el tema Streams para el final de info1 .Estoy haciendo el siguiente ejercicio de la guia

Ejercicio 11.1.
Escriba un programa que lea el archivo de texto que recibe por línea de
comandos y determine:
a) Cantidad total de palabras
b) Cantidad de veces que aparece la palabra “diodo”




#include <stdio.h>
#include <stdlib.h>

int main(int c, char **argv)
{
char *path;
path = argv[1];
FILE *fp;
char n;
int cantidad_palabras = 0;
fp = fopen(path,"r+b");
fread(&n,1,sizeof(char),fp);
while(!feof(fp)) //voy leyendo el archivo hasta llegar al final
{
switch(n)
{
case ' ':
cantidad_palabras++;
break;
default:
break;
}
fread(&n,1,sizeof(char),fp);
}
fprintf(stdout,"\n Hay %d palabras \n",cantidad_palabras);
fclose(fp);
return 0;
}



Tengo varias consultas, esta bien implementado lo que hice para saber cuantas palabras hay ?? , o sea yo voy levantando caracter por caracter y me fijo si es el caracter espacio y asi hasta llegar al final del archivo.
El inciso b) para saber cuantas veces aparece la palabra diodo se me complico un poco ya que primero pense en buscar la letra d , y fijarme si lios siguientes 4 caracteres son "iodo" pero puede aparecer ddiodo o algo asi entonces no funcionaria...

Otra consulta, cual es la diferencia entre utilizar las funciones fopen,fread... y open,read,write.. ??? O sea, yo se que las open,read,write son funciones de Unix y las que tienen la "f" son funciones del ANSI C , pero cual conviene utilizar entonces ?

PD: si alguno tiene resuelto estos ejercicios me vendria de 10

Un saludo a todos
Y desde ya muchas gracias
16-01-2014 15:07
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Amadeo Sin conexión
Profesor del Modulo A
Sin estado :(
*****

Otra
UBA - Ciencias Exactas y Naturales

Mensajes: 335
Agradecimientos dados: 3
Agradecimientos: 8 en 8 posts
Registro en: Dec 2009
Mensaje: #2
RE: Duda Ejercicio de Manejo de Archivos
(16-01-2014 15:07)nanohueso escribió:  Otra consulta, cual es la diferencia entre utilizar las funciones fopen,fread... y open,read,write.. ??? O sea, yo se que las open,read,write son funciones de Unix y las que tienen la "f" son funciones del ANSI C , pero cual conviene utilizar entonces ?

Las de C tienen un poco más de abstracción. Por ejemplo, open() devuelve un int asi pelado, mientras que fopen() te devuelve un FILE*. Obviamente te conviene usar las de C.
Para lo de diodo, podrías guardarte el caracter anterior que levantaste en una variable aparte, y cuando levantas un caracter nuevo en n, comparas con esa otra variable. Si tenías basura antes y levantaste una 'd', actualizas el caracter previo. Si tenías una 'd' y levantaste una 'd', la dejas igual; si tenias una 'd' y levantaste algo que no es una 'd' ni una 'i', actualizas la anterior a cero (o cualquier otra cosa), ya que se trata de otra palabra; y si tenias una 'd' y levantas una 'i', la actualizas a 'i'. Y después más o menos lo mismo con las otras letras. Cuando llegas a la 'o' y tenes un espacio después (o no, por ahí vale que esten pegadas las palabras), le sumas 1 a algún contador y listo.

.
(Este mensaje fue modificado por última vez en: 16-01-2014 18:08 por Amadeo.)
16-01-2014 18:05
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Amadeo recibio 1 Gracias por este post
nanohueso (16-01-2014)
sacros Sin conexión
Profesor del Modulo A
<img src=x onerror="al...
*****

Otra
Facultad Regional Buenos Aires

Mensajes: 246
Agradecimientos dados: 94
Agradecimientos: 68 en 26 posts
Registro en: Nov 2010
Mensaje: #3
RE: Duda Ejercicio de Manejo de Archivos
mira, "bien implementado" estaria si vos te pones de acuerdo con quien sea que use el programa de que solo usen un espacio para separar palabras SIEMPRE y no te metan espacios al principio/final. yo te podria pasar un archivo con 58 caracteres espacio y vas a tener 58 palabras cuando no hay ninguna. o ponele, si uso tabs para separar palabras donde te metes? xD

yo no se si lo llegan a ver en en tu materia pero la solucion de libro para los dos problemas (saber si dice "diodo" y el contador de palabras) es codear una maquina de estados.

se puede llegar a hacer alguna cosa con el contador de palabras onda hacer primero otro archivo que reduzca cadenas de muchos espacios a uno solo y que trimmee espacios del principio y final o si hay puntos (antes y despues de los puntos) y recien ahi contar; pero aca la posta es una maquina de estados.

te conviene usar la biblioteca standard de C para que el programa sea portable, pero puede que eso no te interese, en cuyo caso da lo mismo.
(Este mensaje fue modificado por última vez en: 16-01-2014 19:59 por sacros.)
16-01-2014 19:54
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] sacros recibio 1 Gracias por este post
nanohueso (16-01-2014)
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 269
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #4
RE: Duda Ejercicio de Manejo de Archivos
Muchas gracias a Amadeo y a Sacros por su ayuda, subo el ejercicio resuelto =)




#include <stdio.h>
#include <stdlib.h>


//int buscar_diodo(FILE * , int);

int main(int c, char **argv)
{
char *path;
path = argv[1];
FILE *fp;
char n,letra_anterior;
char palabra[] = "diodo";
int aux=0;
int cantidad_palabras = 0;
int diodo=0;
fp = fopen(path,"r+b");

fread(&n,1,sizeof(char),fp);

while(!feof(fp)) //voy leyendo el archivo hasta llegar al final
{

switch(n)
{
case ' ':
cantidad_palabras++;
break;
case 'd':
if( aux == 0)
{
letra_anterior=n;
aux = 1;
}
if( letra_anterior == palabra[2] && aux== 3)
{
letra_anterior = palabra[3];
aux = 4;
}
case 'i':
if(letra_anterior == palabra[0] && aux == 1)
{
letra_anterior=palabra[1];
aux = 2;
}
else
{
aux = 0;
}
break;
case 'o':
if(letra_anterior == palabra[1] && aux == 2)
{
letra_anterior = palabra[2];
aux = 3;
}
if(letra_anterior == palabra[3] && aux == 4)
{
letra_anterior=palabra[4];
diodo++;
}
else
{
aux = 0;
}
default:
break;
}

fread(&n,1,sizeof(char),fp);

}

fprintf(stdout,"\n Hay %d palabras \n",cantidad_palabras);
fprintf(stdout,"\n La palabra diodo aparece %d veces \n",diodo);
fclose(fp);

return 0;

}


17-01-2014 11:14
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
leibniz Sin conexión
Secretario General

*******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 849
Agradecimientos dados: 46
Agradecimientos: 24 en 17 posts
Registro en: Dec 2012
Mensaje: #5
RE: Duda Ejercicio de Manejo de Archivos
Quizás sería más elegante primero buscar un espacio, después leer tantos bytes como la palabra buscada, si coincide lo contas y seguis, si no coincide avanzas.

[Imagen: Leibnitz_signature.svg]
18-01-2014 10:09
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 269
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #6
RE: Duda Ejercicio de Manejo de Archivos
(18-01-2014 10:09)leibniz escribió:  Quizás sería más elegante primero buscar un espacio, después leer tantos bytes como la palabra buscada, si coincide lo contas y seguis, si no coincide avanzas.

leibniz , gracias por tu comentario

El problema de leer tantos bytes como la palabra los tenga es que, que pasa si tengo la palabra "oiddo" o "doido" , pesarian lo mismo y sin embargo no es la palabra diodo.

Un saludo!!
19-01-2014 10:43
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
Ing. Electrónico
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.672
Agradecimientos dados: 601
Agradecimientos: 2.977 en 451 posts
Registro en: Apr 2010
Mensaje: #7
RE: Duda Ejercicio de Manejo de Archivos
Yo hice uno parecido en un parcial...
Fijate, solo que como no sabía todavía manejo de archivos nosotros ingresabamos parrafos... pero es lo mismo...

http://www.utnianos.com.ar/foro/tema-inf...er-parcial

Esa fue la resolución que yo plantee y funcionaba bien..

[Imagen: digitalizartransparent.png]
19-01-2014 12:24
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
leibniz Sin conexión
Secretario General

*******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 849
Agradecimientos dados: 46
Agradecimientos: 24 en 17 posts
Registro en: Dec 2012
Mensaje: #8
RE: Duda Ejercicio de Manejo de Archivos
(19-01-2014 10:43)nanohueso escribió:  
(18-01-2014 10:09)leibniz escribió:  Quizás sería más elegante primero buscar un espacio, después leer tantos bytes como la palabra buscada, si coincide lo contas y seguis, si no coincide avanzas.

leibniz , gracias por tu comentario

El problema de leer tantos bytes como la palabra los tenga es que, que pasa si tengo la palabra "oiddo" o "doido" , pesarian lo mismo y sin embargo no es la palabra diodo.

Un saludo!!

Quizás no me expliqué bien. Buscas un espacio. Cuando matchea, estas al inicio de una palabra. Lees tantos caracteres como tenga la palabra y las comparas con strcmp. Si matchea, verificas que el siguiente caracter sea un espacio, incrementas un contador, si no, buscas el próximo inicio de palabra.

[Imagen: Leibnitz_signature.svg]
19-01-2014 12:48
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
sacros Sin conexión
Profesor del Modulo A
<img src=x onerror="al...
*****

Otra
Facultad Regional Buenos Aires

Mensajes: 246
Agradecimientos dados: 94
Agradecimientos: 68 en 26 posts
Registro en: Nov 2010
Mensaje: #9
RE: Duda Ejercicio de Manejo de Archivos
el problema con el metodo de contar espacios para decir cuantas palabras hay es que siempre hay una palabra mas que los espacios que uses, por ejemplo:

"en este string" tenes 2 espacios pero 3 palabras

si queres seguir usando tu metodo de contar espacios asumiendo que el archivo siempre va a venir formateado como vos esperas, tendrias que sumar uno a la cantidad de espacios

despues me parece que hay un problema con la maquina de estados. corri el programa pasandole un archivo con esto adentro:

"diodo ddiodo diododiodo cacadiodo"

y me dice que la palabra diodo esta 0 veces, mantenenos al tanto de si te sale asi cualquier cosa te doy una mano, suerte con eso
19-01-2014 15:04
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
leibniz Sin conexión
Secretario General

*******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 849
Agradecimientos dados: 46
Agradecimientos: 24 en 17 posts
Registro en: Dec 2012
Mensaje: #10
RE: Duda Ejercicio de Manejo de Archivos
No había considerado que pasaba si la palabra estaba al principio del archivo. =)

Spoiler: Mostrar


#include <stdio.h> //FILE
#include <string.h> //strlen strcpy

void main() {
FILE *archivo;
char rutaArchivo[]="prueba_busqueda.txt";

char caracter;
char palabra[5];

archivo=fopen(rutaArchivo,"r");

while ( feof(archivo) == 0 ) {
fscanf(archivo,"%c",&caracter);

if ( feof(archivo) == 0 ) {
if ( caracter == ' ' ) { //fin de la palabra
fseek(archivo, 5, SEEK_CUR); //rebobino
fscanf(archivo,"%s",palabra); //leo
if ( strcmp("diodo",palabra) == 0 ) { //comparo
printf("%s\n",palabra); }
}
}
}

fclose(archivo);
};



Como todo, puede mejorarse... pero funciona bastante bien.

[Imagen: Leibnitz_signature.svg]
(Este mensaje fue modificado por última vez en: 19-01-2014 17:45 por leibniz.)
19-01-2014 17:44
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] leibniz recibio 1 Gracias por este post
nanohueso (20-01-2014)
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 269
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #11
RE: Duda Ejercicio de Manejo de Archivos
Para probarlo en linux el programa ,cuando creo un archivo y le pongo por ejemplo " diodo ddiodo cacadiodo" , que extension tengo que ponerle ? , .dat ?? , cuando lo levanto con fread le pongo "r+b" o "r+t" ??

Saludoos
20-01-2014 13:36
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
Ing. Electrónico
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.672
Agradecimientos dados: 601
Agradecimientos: 2.977 en 451 posts
Registro en: Apr 2010
Mensaje: #12
RE: Duda Ejercicio de Manejo de Archivos
fp = fopen("texto.txt","r");

y si es .dat: fp = fopen("texto.dat","r");

[Imagen: digitalizartransparent.png]
20-01-2014 13:46
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 269
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #13
RE: Duda Ejercicio de Manejo de Archivos
(20-01-2014 13:46)Feer escribió:  fp = fopen("texto.txt","r");

y si es .dat: fp = fopen("texto.dat","r");

con cual me conviene trabajar Feer ? .dat o .txt ?
20-01-2014 14:24
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
Ing. Electrónico
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.672
Agradecimientos dados: 601
Agradecimientos: 2.977 en 451 posts
Registro en: Apr 2010
Mensaje: #14
RE: Duda Ejercicio de Manejo de Archivos
yo usaba .txt que es el archivo de texto común aaja, calculo q es lo mismo

[Imagen: digitalizartransparent.png]
20-01-2014 14:32
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Feer recibio 1 Gracias por este post
nanohueso (20-01-2014)
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 269
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #15
RE: Duda Ejercicio de Manejo de Archivos
(20-01-2014 14:32)Feer escribió:  yo usaba .txt que es el archivo de texto común aaja, calculo q es lo mismo

bueno gracias =D
20-01-2014 14:34
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)