elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda con arreglos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda con arreglos  (Leído 1,969 veces)
sheva777

Desconectado Desconectado

Mensajes: 8


Ver Perfil
duda con arreglos
« en: 29 Mayo 2013, 05:18 am »

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);

}


En línea

sheva777

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: duda con arreglos
« Respuesta #1 en: 29 Mayo 2013, 05:55 am »

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.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: duda con arreglos
« Respuesta #2 en: 29 Mayo 2013, 16:03 pm »

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:
Código
  1. while (!feof (archivo) ) {
  2.   for (i = 0; i < MAX; i = i + 1) {
  3.      fscanf (archivo, "%d", &c);
  4.      A[i] = c;
  5.      printf ("%d ", A[i]);
  6.   }
  7. }
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX 100
  5.  
  6. void llenar(int A[]);
  7.  
  8. int main(void)
  9. {
  10.   int arreglo[MAX];
  11.  
  12.   llenar(arreglo);
  13.   return 0;
  14. }
  15.  
  16. void llenar(int A[])
  17. {
  18.   FILE *archivo;
  19.   char nombreArchivo[20];
  20.   int i;
  21.  
  22.   while (1){
  23.      printf("Nombre de archivo a trabajar con extension (txt):");
  24.      fflush(stdout);
  25.      scanf("%s", nombreArchivo);
  26.  
  27.      if ((archivo = fopen(nombreArchivo, "r")) == NULL)
  28.         puts("El archivo no pudo abrirse");
  29.      else
  30.         break;
  31.   }
  32.  
  33.   for (i = 0; i < MAX && fscanf(archivo, "%d", A + i) == 1; i++)
  34.      printf(" %d", A[i]);
  35.   putchar('\n');
  36.   fclose(archivo);
  37. }

----

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:
Código
  1. int fn(char a[]);
  2.  
  3. int fn(char a[123]);
En realidad se procesa como:
Código
  1. 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:
Código
  1. int fn(char *a, size_t num_elem);

Un saludo
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
DUDA ejercicio de arreglos
Java
ailaht 2 2,639 Último mensaje 29 Marzo 2009, 20:36 pm
por juancho77
Duda arreglos asociativos
PHP
SeC 3 3,299 Último mensaje 20 Abril 2010, 03:59 am
por SeC
[Duda]Arreglos en PHP
PHP
rolly21102 8 4,027 Último mensaje 6 Julio 2010, 21:16 pm
por rolly21102
Duda arreglos
Programación C/C++
alexis33de 7 4,040 Último mensaje 31 Agosto 2010, 18:27 pm
por [L]ord [R]NA
duda con arreglos
Java
droidZ 2 1,733 Último mensaje 24 Septiembre 2013, 19:16 pm
por droidZ
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines