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 - Arturo400

#1
Cita de: MAFUS en 25 Septiembre 2016, 20:15 PM
Muy buenas. Para solucionar tu problema con las comas puedes hacer uso de una funcionalidad un poco más avanzada de fscanf. Impresión queda así:
void IMPRESION()
{
    FILE*fd;

    int doc,i=0;
    char nombre[50]={0},pais[50]={0};

    fd=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","r");

    printf("Documento\tNombre\tPais\n");
    fscanf(fd,"%d,%[^,],%[^\n]",&doc,nombre,pais);
    while(!feof(fd) && i<N)
    {
        printf("%d,%s,%s\n",doc,nombre,pais);
        fscanf(fd,"%d,%[^,],%[^\n]",&doc,nombre,pais);
        i++;
    }
    fclose(fd);
}


La cadenade control de fscanf ha cambiado un poco.
Tu idea de usar comas separadoras está bien, pues es el mismo formato que scanf va a recibir y va a desechar esas comas. El problema venía que recogías tanto nombre como país con el argumento %s que coge toda la cadena hasta que haya un espacio en blanco (tabulación, nueva línea, etc.) por lo que también te pillaba la coma.
Sin embargo haciendo uso de %[^,] le dices a fscanf: guarda la cadena hasta que encuentres el caracter coma (los corchetes indican los caracteres que debe recoger fscanf, el acento circunflejo al principio indica negación, es decir, que se debe recoger todos los caracteres hasta encontrar uno de esa lista). Así que capturarás toda la cadena hasta que llegues a la coma.
Después te encuentras la coma que vas a desechar y empieza otra captura de cadena hasta que llegue al final de ésta, el caracter de nueva línea, como marca %[^\n].

Wow, no sabia que se podia hacer eso!. Ahora si lee todo. Te hago una ultima consulta. Como puedo hacer para que me quede la impresion de manera ordenada?.
Porque supongamos que los datos del txt son asi:

39581882,agustin,francia
39149112,Ricardo Lopez,Argentina
41959129,Agustin,Grecia.

Entonces cuando quiero imprimir me queda un poco descordinado la parte de paises y nombres y no me queda del todo prolijo, con los \t no lo pude solucionar
#2
Hola

Pero en ese caso me imprimiria con las comas incluidas en cada columna, como hago para que no me tome las comas?.
#3
Hola

Tengo un programa en el cual tengo que crear un nuevo tipo de dato struct en el cual voy a tener 3 variables, una que es el documento de la persona, la otra es el nombre de la persona y por ultimo la nacionalidad de la persona.

Al principio lo que tengo que hacer es cargar manualmente el nuevo tipo de dato, la carga va a finalizar cuando el documento sea igual a 0.

Luego va a pasar todo lo cargado a un archivo txt. (Hasta aca, va perfecto todo ;-))

El problema surge cuando tengo que leer el archivo e imprimir el contenido . Lo que sucede es que cuando pongo while(!feof(fd)) la lectura del archivo no termina nunca, siempre me arroja los mismos valores, nunca termina el ciclo y ademas nunca me carga la nacionalidad.

El archivo se va a cargar de la siguiente manera.

38747443,Agustin,Argentina

Es decir que en cada linea del archivo txt voy a tener ese tipo de secuencia.

Este es el codigo que hice

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 5

struct s_datos
{
   int doc;
   char nombre[50];
   char pais[50];

};
typedef struct s_datos dato;

int CARGA(dato charge[N]);
void CREACION(dato charge[N],int);
void IMPRESION();

int main()
{
   int i=0,j=0;
   dato charge[N];
   i=CARGA(charge);  /// i es la cantidad de personas que tengo.
   printf("\nEl valor de i es %d",i);
   for (j=0;j<i;j++)
   {
       printf("\n%d",charge[j].doc);
       printf("\n%s",charge[j].nombre);
       printf("\n%s",charge[j].pais);
   }
CREACION(charge,i);  ///Llamo a la funcion para crear un txt y le paso el nuevo dato struct y la cantidad de personas ingreadas.
printf("\n");
IMPRESION();



   return 0;
}

int CARGA(dato charge[N])
{
  int i=0,j=0,e=0;
  char letra='a';
  charge[i].doc=4;
  while (i<N)
  {
      printf("\nIngrese el numero de documento: ");
      scanf("%d",&charge[i].doc);
          if (charge[i].doc!=0)
          {
              printf("\nIngrese el nombre: ");

                  while(letra!='\r')
                  {
                     letra=getche();
                     charge[i].nombre[j]=letra;
                     j++;
                  }
                  charge[i].nombre[j]='\0';
              j=0;
              letra='a';

              printf("\nIngrese el pais: ");

                  while(letra!='\r')
                  {
                     letra=getche();
                     charge[i].pais[e]=letra;
                     e++;
                  }
                  charge[i].pais[e]='\0';
                  e=0;
              letra='a';
              i++;
          }
      if(charge[i].doc==0)
      {
          return i;
      }
  }
  return i;

}

void CREACION(dato charge[N],int i)
{
   FILE*arch;
   arch=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","w");
   int j=0;
   while(j<i)
   {
       fprintf(arch,"%d,%s,%s\n",charge[j].doc,charge[j].nombre,charge[j].pais);
       j++;
   }
   fclose(arch);
}

void IMPRESION()
{
   FILE*fd;

   int doc,i=0;
   char nombre[50]={0},pais[50]={0};

   fd=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","r");

   printf("Documento\tNombre\tPais\n");
   fscanf(fd,"%d,%s,%s\n",&doc,&nombre,&pais);
   while(!feof(fd) && i<4)
   {
       printf("%d\t%s\t%s\n",doc,nombre,pais);
       fscanf(fd,"%d,%s,%s\n",&doc,&nombre,&pais);
       i++;
   }
   fclose(fd);
}



La funcion que funciona mal es IMPRESION y no le veo defecto alguno.
#4
En la linea 9 cuando llamas a la funcion 2 es sin parentesis
Quedaria uno(dos);
Tene en cuenta que a la funcion uno le estas pasando como parametro algo, y ese parametro va sin corchetes ni parentesis en el llamado.
#5
Hola

Tengo una duda. Tengo que cargar una estructura con ciertos datos y luego esos datos los tengo que pasar a un archivo txt o csv.
Esto es lo que tengo hasta ahora

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 5

struct s_datos
{
    int doc;
    char nombre[50];
    char pais[50];

};
typedef struct s_datos dato;

int CARGA(dato charge[N]);
void CREACION(dato charge[N],int);

int main()
{
    int i=0,j=0;
    dato charge[N];
    i=CARGA(charge);
    printf("\nEl valor de i es %d",i);
    for (j=0;j<i;j++)
    {
        printf("\n%d",charge[j].doc);
        printf("\n%s",charge[j].nombre);
        printf("\n%s",charge[j].pais);
    }
    CREACION(charge,i);




    return 0;
}

int CARGA(dato charge[N])
{
   int i=0,j=0,e=0,k=0;
   char letra='a';
   charge[i].doc=4;
   while (i<N)
   {
       printf("\nIngrese el numero de documento: ");
       scanf("%d",&charge[i].doc);
           if (charge[i].doc!=0)
           {
               printf("\nIngrese el nombre: ");

                   while(letra!='\r')
                   {
                      letra=getche();
                      charge[i].nombre[j]=letra;
                      j++;
                   }
                   charge[i].nombre[j]='\0';
               j=0;
               letra='a';

               printf("\nIngrese el pais: ");

                   while(letra!='\r')
                   {
                      letra=getche();
                      charge[i].pais[e]=letra;
                      e++;
                   }
                   charge[i].pais[e]='\0';
                   e=0;
               letra='a';
               i++;
           }
       if(charge[i].doc==0)
       {
           return i;
       }
   }
   return i;

}

void CREACION(dato charge[N],int i)
{
    FILE*arch;
    arch=fopen("C:\\Users\\PC\\Desktop\\personas.txt","w");
    char c='4';
    int j=0;
    while(!feof(arch))
    {
        if (j<i)
        fprintf(arch,"%d",charge[j].doc);
        fputc(c,arch);
        if (c=='\n')
        j++;



    }
    fclose(arch);



}



La carga la realiza de forma perfecta. El problema es cuando tengo que pasar esos datos a un archivo.
Ya que tengo 1 int y 2 char de string.

Para el dato que es el documento no tengo ningun problema ya que utilizo la siguiente sentencia y lo guarda en el txt

fprintf(arch,"%d",charge[j].doc);

El problema es con los otros 2 datos.
Nuestro profesor nos "obliga" por asi decirlo a usar fputc, entonces si yo pongo el fputc en el ciclo, solo estaria tomando una letra y yo quiero que tome letras hasta que encuentre un \n o un \0 pero nose como aplicarlo en el codigo.
#6
Hola

Estoy realizando un programa en el cual tengo que leer una frase de un archivo y guardarla en un puntero. Hasta ahi no hay ningun problema. Luego lo que tengo que hacer es seleccionar un entero desde el cual se va a leer la frase y cuantos caracteres quiero leer de esa frase. Lo que queda va a ser guardado en un nuevo puntero que tengo que mostrar por pantalla.

Entonces si tengo la frase

"Universidad de Buenos Aires"

Y leo desde el caracter 4  unos 5 caracteres, en mi nuevo puntero tendria que quedar "ersida".

Hasta ahora he tratado de hacerlo y no le encuentro la forma, cuando intento que lea desde un cierto caracter o no copia nada al nuevo puntero o copia letras que no tendrian que ir.

Les dejo mi codigo para ver si me pueden ayudar para ver en que me estoy equivocando.
El programa se divide en una parte en donde le pido la informacion al archivo y la guardo en un nuevo puntero y la otra parte en donde intento a partir del puntero ya existente, crear otro.

[/#include <stdio.h>
#include <stdlib.h>
char * subcadena (char * p, unsigned int i, unsigned int n);  ///Esta funcion recibe mi puntero original y la longitud que quiero y retorna un nuevo puntero.
char * LECTURA();

int main()
{
    char *pa; /// Puntero donde guardo la informacion del archivo
    char *pb;
    unsigned int inicio;
    unsigned int cantidad;

    pa=LECTURA();
    printf(" \nLo leido del archivo es : %s \n ",pa);
    printf("Ingrese el caracter desde el cual desea leer de la frase : ");
    scanf("%d",&inicio);
    printf("\nIngrese la cantidad de caracteres que desea contar: ");
    scanf("%d",&cantidad);
    pb=subcadena(pa,inicio,cantidad);
    printf("\nLa frase queda : %s",pb);
    return 0;
}



char* LECTURA()
{
    int i=0;
    char c;
    char *pa;

    FILE*arch;

    arch=fopen("C:\\Users\\PC\\Desktop\\frases.txt","r"); ///Supongamos que en el txt esta "Universidad De Buenos Aires" - Solo esa frase.

    pa=malloc(sizeof(char));

    c=fgetc(arch);

    while(!feof(arch))
    {
        *(pa+i)=c;
        i++;
        pa=realloc(pa,(i+1)*sizeof(char));
        c=fgetc(arch);
    }
    *(pa+i)='\0';
    fclose(arch);
    return pa;
}



char * subcadena (char * p, unsigned int i, unsigned int n)
{

int j=0;
char * pc;
char letra;
pc=malloc(sizeof(char));
while(*(p+i)!='\0' && i<=n)
{
     letra=*(p+i);
     *(pc+j)=letra;
     j++;
     pc=realloc(pc,(j+1)*sizeof(char));
     i++;
}
    *(pc+j)='\0';
    return pc;
}
code]