duda con arreglos

Iniciado por sheva777, 29 Mayo 2013, 05:18 AM

0 Miembros y 1 Visitante están viendo este tema.

sheva777

Tengo una duda con este codigo:
Lo que quiero hacer es llenar un arreglo de numeros desde archivo y despues desplegarlo en pantalla, lo unico malo es que me muestra mas numeros de los que tengo en el archivo, mi duda es saber el por que me pasa esto les dejo el archivo y el codigo. Gracias de ante mano

archivo.txt
1 2 3 4 5 7 12 98 34 65 87 2 10

codigo

#include <stdio.h>
#include <stdlib.h>
#define MAX 100



void llenar(int A[],FILE *archivo)
{
char nombreArchivo [20];
int k;
int i;
int c;

printf("Nombre de archivo a trabajar con extensión (txt):");
scanf("%s",&nombreArchivo);
archivo=fopen(nombreArchivo,"r");

while(archivo == NULL){
      printf("El archivo no pudo abrirse\n");
      printf("Nombre de archivo a trabajar con extensión (txt): ");
      scanf("%s",&nombreArchivo);
      archivo = fopen(nombreArchivo,"r");
   }

   while(!feof(archivo))
   {
      for(i=0;i<MAX;i=i+1)
      {
         fscanf(archivo,"%d",&c);
         A=c;
         printf("%d ",A);

      }
   }
       fclose(archivo);
}

int main()
{
int arreglo[MAX];
FILE  *archivo=NULL;

llenar(arreglo,archivo);

}

sheva777

haciendo un poco mas de mi codigo tengo otra duda necesito saber el tamaño de mi arreglo para cual utilizo esto

int cantidad;
   cantidad=sizeof(A)/4;
   printf("El arreglo tiene %d elementos\n",cantidad);

pero solo me muestra de tamaño lo siguiente

El arreglo tiene 1 elementos

Seria de gran ayuda si pudieran ayudarme a resolverlo. gracias.

rir3760

Primero: cuando publiques código fuente utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

Errores y deficiencias en ese programa hay varios. Por ejemplo en la función "llenar" lo primero que haces con el parámetro "archivo" es sobrescribir su valor y por ello no debe ser un parámetro sino una variable local a la función.

El error principal se debe a que tratas de leer los números del archivo con dos bucles:
while (!feof (archivo) ) {
   for (i = 0; i < MAX; i = i + 1) {
      fscanf (archivo, "%d", &c);
      A[i] = c;
      printf ("%d ", A[i]);
   }
}

En su lugar debes utilizar solo uno donde primero verificas que haya espacio en el array (validación del indice) y a continuación si se leyó con éxito un valor del archivo (valor de retorno de la función fscanf).

El programa corregido:
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

void llenar(int A[]);

int main(void)
{
   int arreglo[MAX];
   
   llenar(arreglo);
   return 0;
}

void llenar(int A[])
{
   FILE *archivo;
   char nombreArchivo[20];
   int i;
   
   while (1){
      printf("Nombre de archivo a trabajar con extension (txt):");
      fflush(stdout);
      scanf("%s", nombreArchivo);
     
      if ((archivo = fopen(nombreArchivo, "r")) == NULL)
         puts("El archivo no pudo abrirse");
      else
         break;
   }
   
   for (i = 0; i < MAX && fscanf(archivo, "%d", A + i) == 1; i++)
      printf(" %d", A[i]);
   putchar('\n');
   fclose(archivo);
}


----

En cuanto a tu segunda pregunta la respuesta es no, no puedes calcular el tamaño de un array pasado como argumento. Ello porque toda función declarada en alguna de estas dos formas:
int fn(char a[]);

int fn(char a[123]);

En realidad se procesa como:
int fn(char *a);
Para solucionarlo no hay opción mas que pasar de forma manual (mediante un parámetro adicional) el numero de elementos:
int fn(char *a, size_t num_elem);

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language