Hola a todos.
Tengo este ejercicio que se debe ejecutar desde la linea de comandos y que se le pasan los siguientes parametros:
-c Cuenta el nº de caracteres del fichero
-l Cuenta el nº de líneas del fichero
-p Cuenta el nº de palabras, donde una palabra
La sintaxis a la hora de abrirlo por la linea de comandos es la siguiente: Cuenta Nombre_Fichero [-c][-l][-p]
He hecho el siguiente codigo, pero a la hora de abrirlo nunca me hace nada.
¿Alguien sabe que ocurre?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ESPACIO ' '
#define TAB '\t'
#define INTRO '\n'
void MostrarAyuda();
void cuenta_caracteres();
void cuenta_lineas();
void cuenta_palabras();
main(int argc, char *argv[])
{
FILE *f;
if((f=fopen("fichero.txt","r"))==NULL)
{
printf("No se puede abrir el fichero");
system("pause");
exit (0);
}
if(strcmp(argv[1],"c")==0)
cuenta_caracteres();
if(strcmp(argv[1],"l")==0)
cuenta_lineas();
if(strcmp(argv[1],"p")==0)
cuenta_palabras;
if(argc<2)
MostrarAyuda();
system("pause");
}
void MostrarAyuda()
{
printf("\n-c: Cuenta el numero de caracteres del fichero\n");
printf("\n-l: Cuenta el numero de lineas del fichero\n");
printf("\n-p: Cuenta el numero de palabras del fichero\n");
}
void cuenta_caracteres()
{
FILE *f;
char car;
int i=0;
while(car!=EOF)
{
car=fgetc(f);
i++;
}
printf("\n\nLos caracteres totales son %d\n",i-1);
}
void cuenta_palabras()
{
FILE *f;
char car;
int palabra=0;
while(car!=EOF)
{
if(car==ESPACIO || car==TAB || car==INTRO)
palabra++;
}
printf("\n\nEl archivo contiene %d palabras\n",palabra+1);
}
void cuenta_lineas()
{
FILE *f;
char car;
int linea=0;
while(car!=EOF)
{
printf("%c",car);
car=fgetc(f);
if(car=='\n')
linea++;
}
printf("\n\nEl archivo contiene %d lineas\n",linea);
}
Si yo escribo Cuenta -c el argv[1] es igual a "-c" por lo que deberías cambiar el IF y agregarle el menos :
if(strcmp(argv[1],"-c")==0)
Deduzco que usas windows por lo de system("pause"), yo lo probe en Linux, no se si es lo mismo.
Acabo de probar lo de escribir -c en el codigo, pero a la hora de ejecutarlo desde la linea de comandos da un error y no hace nada. A ti te funciono en Linux?
Fijate que en cada función a la que llamas estás declarando de nuevo una variable FILE, y luego la intentas usar sin tan siquiera abrir el fichero , que tal si se lo pasas como parámetro ?
void cuenta_caracteres(FILE *f){
char car;
int i=0;
car = (char) fgetc(f);
while(car!=EOF) {
car=(char)fgetc(f);
i++;
}
printf("\n\nLos caracteres totales son %d\n",i-1);
}
El número de argumento compruebalo antes de cualquier hacer cualquier cosa.
if(argc<2){
MostrarAyuda();
exit (-1);
}
Y luego llamas a la función como cualquier otra , siempre usando el fichero que abriste al principio
if(strcmp(argv[1],"c")==0)
cuenta_caracteres(f);
Intenta comentar e identar bien el código .
Nunca uses system("PAUSE") en su lugar usa getchar();
La versión que he probado cuenta los caracteres , y la llamo de la siguiente manera desde linux
user$ gcc cuenta.c -o cuenta
user $ ./cuenta c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ESPACIO ' '
#define TAB '\t'
#define INTRO '\n'
void MostrarAyuda();
void cuenta_caracteres();
void cuenta_lineas();
void cuenta_palabras();
main(int argc, char *argv[]){
FILE *f;
if((f=fopen("fichero.txt","r"))==NULL) {
printf("No se puede abrir el fichero");
getchar();
exit (0);
}
if(argc<2){
MostrarAyuda();
exit (-1);
}
if(strcmp(argv[1],"c")==0)
cuenta_caracteres(f);
if(strcmp(argv[1],"l")==0)
cuenta_lineas(f);
if(strcmp(argv[1],"p")==0)
cuenta_palabras(f);
getchar();
}
void MostrarAyuda()
{
printf("\n-c: Cuenta el numero de caracteres del fichero\n");
printf("\n-l: Cuenta el numero de lineas del fichero\n");
printf("\n-p: Cuenta el numero de palabras del fichero\n");
}
void cuenta_caracteres(FILE *f){
char car;
int i=0;
car = (char) fgetc(f);
while(car!=EOF) {
car=(char)fgetc(f);
i++;
}
printf("\n\nLos caracteres totales son %d\n",i-1);
}
void cuenta_palabras(FILE *f)
{
char car;
int palabra=0;
while(car!=EOF)
{
if(car==ESPACIO || car==TAB || car==INTRO)
palabra++;
}
printf("\n\nEl archivo contiene %d palabras\n",palabra+1);
}
void cuenta_lineas(FILE *f)
{
char car;
int linea=0;
while(car!=EOF) {
printf("%c",car);
car=fgetc(f);
if(car=='\n')
linea++;
}
printf("\n\nEl archivo contiene %d lineas\n",linea);
}
Vale, gracias por contestar. Ya lo tengo bien casi todo, solo me falla que si pongo en la linea de comandos Cuenta + el nombre del fichero me llame a las tres funciones y me muestre todos los resultados. Lo que pasa que tal y como lo tengo puesto solo me muestra bien la primera opcion. Las demas no me las hace.
Por ejemplo: Si pongo Cuenta fichero.txt me cuenta bien los caracteres pero no las palabras y las lineas.
Me falla esto
if(argc==2)
{
cuenta_caracteres(f);
cuenta_lineas(f);
cuenta_palabras(f);
}
Mirad el codigo
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ESPACIO ' '
#define TAB '\t'
#define INTRO '\n'
void MostrarAyuda();
void cuenta_caracteres(FILE *);
void cuenta_lineas(FILE *);
void cuenta_palabras(FILE *);
main(int argc, char *argv[])
{
if(argc==1)
{
printf("\n\t\t\tAYUDA\n");
MostrarAyuda();
}
FILE *f;
if((f=fopen(argv[1],"r"))==NULL)
{
printf("\nNo se puede abrir el fichero\n");
getchar();
}
if(argc==2)
{
cuenta_caracteres(f);
cuenta_lineas(f);
cuenta_palabras(f);
}
else if(argc==3)
{
if(strcmp(argv[2],"-c")==0)
cuenta_caracteres(f);
if(strcmp(argv[2],"-l")==0)
cuenta_lineas(f);
if(strcmp(argv[2],"-p")==0)
cuenta_palabras(f);
}
fclose(f);
}
void MostrarAyuda()
{
printf("\n-c: Cuenta el numero de caracteres del fichero\n");
printf("\n-l: Cuenta el numero de lineas del fichero\n");
printf("\n-p: Cuenta el numero de palabras del fichero\n");
}
void cuenta_caracteres(FILE *f)
{
int c, cont=0;
while((c=getc(f))!=EOF)
{
if(c!='\n')
cont++;
}
printf("\n\nLos caracteres totales son %d\n",cont);
}
void cuenta_palabras(FILE *f)
{
char car;
int palabra=0;
int i;
while(car!=EOF)
{
car=fgetc(f);
i++;
if(car==ESPACIO || car==INTRO || car==TAB)
palabra++;
}
printf("\n\nLas palabras totales son %d\n",palabra+1);
}
void cuenta_lineas(FILE *f)
{
char car;
int linea=0;
while(car!=EOF)
{
car=fgetc(f);
if(car=='\n')
linea++;
}
printf("\n\nLas lineas totales son %d\n",linea+1);
}
No estás tan perdido de la solución. Un consejo , utiliza GeSHI para postear el código .
Recuerda comentar el código.
En la función de contar carácteres estás contanto también los espacios, es correcto para ti ?
Olvidabas el return después de MostrarAyuda.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ESPACIO ' '
#define TAB '\t'
#define INTRO '\n'
void MostrarAyuda();
void cuenta_caracteres(FILE *);
void cuenta_lineas(FILE *);
void cuenta_palabras(FILE *);
main(int argc, char *argv[])
{
if(argc==1) {
printf("\n\t\t\tAYUDA\n");
MostrarAyuda();
return;
}
FILE *f;
if((f=fopen(argv[1],"r"))==NULL)
{
printf("\nNo se puede abrir el fichero\n");
getchar();
}
// el argumento 0 es el nombre del programa y el 1 es el nombre del fichero, con lo cual no debemos tratarlos
int i = 2 ;
for (i ; i < argc ;i++){
//por cada argumento
if(strcmp(argv[i],"-c")==0)
cuenta_caracteres(f);
if(strcmp(argv[i],"-l")==0)
cuenta_lineas(f);
if(strcmp(argv[i],"-p")==0)
cuenta_palabras(f);
}
fclose(f);
}
void MostrarAyuda(){
printf("\n-c: Cuenta el numero de caracteres del fichero\n");
printf("\n-l: Cuenta el numero de lineas del fichero\n");
printf("\n-p: Cuenta el numero de palabras del fichero\n");
}
void cuenta_caracteres(FILE *f){
int c, cont=0;
while((c=getc(f))!=EOF) {
if(c!='\n')
cont++;
}
printf("\n\nLos caracteres totales son %d\n",cont);
}
void cuenta_palabras(FILE *f){
char car;
int palabra=0;
int i;
while(car!=EOF){
car=fgetc(f);
i++;
if(car==ESPACIO || car==INTRO || car==TAB)
palabra++;
}
printf("\n\nLas palabras totales son %d\n",palabra);
}
void cuenta_lineas(FILE *f){
char car;
int linea=0;
while(car!=EOF) {
car=fgetc(f);
if(car=='\n')
linea++;
}
printf("\n\nLas lineas totales son %d\n",linea);
}