C/Visual C - error con orednamento de un arreglo en 2 ficheros(

   
Vista:

error con orednamento de un arreglo en 2 ficheros(

Publicado por NicoKratos (6 intervenciones) el 25/04/2010 22:30:45
Estimados, tengo el siguiente problema.
el programa consiste en generar un arreglo de 10 numeros al azar x n filas, ( no es matriz)
la cosa es que se vayan generando 10 numeros random y el usuario ingresa n cantidad de filas o arreglos a generar.
en el archivo.txt se envian los numeros random.
y en el archivo otro.txt se ordenan y envian al archivo otro.txt

el problema es que en el archivo otro.txt se genera una linea de mas
copiando la linea anterior.

1. #include <stdio.h>
2. #include <stdlib.h>
3. main()
4. {
5. /*Declaracion de variables y archivos*/
6. int i, j, c=0,aux,cantFilas,arg[10];
7. FILE *Archivo1, *Archivo2;
8. char arg1[10],val,p;
9.
10.
11.
12. /*Pregunta la cantidad de n filas a producir, validando que solo inghresen enteros*/
13. do
14. {
15. setbuf(stdin, NULL);
16. printf("Ingrese numero de filas a generar: ");
17. }while(!p == scanf("%d",&cantFilas));
18.
19. /* ingreso de numeros random en arreglo de 10*/
20. Archivo1 = fopen("Archivo.txt","w")
21. while ( cantFilas > c )
22. {
23. for(i = 1; i <= 10; i++)
24. {
25. arg[ i ] = rand()%10
26. fprintf(Archivo1,"%d",arg[ i ])
27. }//Fin for
28. fprintf(Archivo1,"\n");
29. c++;
30. }//fin while
31. fclose(Archivo1);//cierro archivo1
32. /*fin ingreso de numero ramdon*/
33.
34. /*leer de archivo.txt los numeros random y, los oredenos y los mando al otro.txt*/
35. Archivo2 = fopen("Otro.txt","w");//Abro otro.txt
36. Archivo1 = fopen("Archivo.txt","r"); //Abro Archivo.txt
37. while (!feof(Archivo1))//Realiza un recorrido del archivo1
38. {
39.
40. fread(arg1,sizeof(char),11,Archivo1);
41. /*Ordenamiento de datos via metodo burbuja*/
42. for(j = 0; j <(10-1); j++)
43. {
44. for(i = j+1; i<10; i++)
45. {
46. if( arg1[ i ] < arg1[ j ])
47. {
48. aux = arg1[ i ];
49. arg1<i> = arg1[ j ];
50. arg1[ j ] = aux;
51. }//fin if que genera un ordenamiento
52. }//fin for i que genera un ordenamemiento
53. }//Fin for j que genera un ordenamiento
54. fwrite(arg1,sizeof(char),11,Archivo2);
55. }//fin while que busca el feof del archivo.txt
56.
57. fclose(Archivo1);//se cierra arch2
58. fclose(Archivo2);//se cierra arch1
59.
60. printf("Gracias, vuelva pronto.\n");
61. system("\n PAUSE");
62. }</i>

#include <stdio.h>
#include <stdlib.h>
main()
{
/*Declaracion de variables y archivos*/
int i, j, c=0,aux,cantFilas,arg[10];
FILE *Archivo1, *Archivo2;
char arg1[10],val,p;


/*Pregunta la cantidad de n filas a producir, validando que solo inghresen enteros*/
do
{
setbuf(stdin, NULL);
printf("Ingrese numero de filas a generar: ");
}while(!p == scanf("%d",&cantFilas));

/* ingreso de numeros random en arreglo de 10*/
Archivo1 = fopen("Archivo.txt","w")
while ( cantFilas > c )
{
for(i = 1; i <= 10; i++)
{
arg[ i ] = rand()%10
fprintf(Archivo1,"%d",arg[ i ])
}//Fin for
fprintf(Archivo1,"\n");
c++;
}//fin while
fclose(Archivo1);//cierro archivo1
/*fin ingreso de numero ramdon*/

/*leer de archivo.txt los numeros random y, los oredenos y los mando al otro.txt*/
Archivo2 = fopen("Otro.txt","w");//Abro otro.txt
Archivo1 = fopen("Archivo.txt","r"); //Abro Archivo.txt
while (!feof(Archivo1))//Realiza un recorrido del archivo1
{

fread(arg1,sizeof(char),11,Archivo1);
/*Ordenamiento de datos via metodo burbuja*/
for(j = 0; j <(10-1); j++)
{
for(i = j+1; i<10; i++)
{
if( arg1[ i ] < arg1[ j ])
{
aux = arg1[ i ];
arg1 = arg1[ j ];
arg1[ j ] = aux;
}//fin if que genera un ordenamiento
}//fin for i que genera un ordenamemiento
}//Fin for j que genera un ordenamiento
fwrite(arg1,sizeof(char),11,Archivo2);
}//fin while que busca el feof del archivo.txt

fclose(Archivo1);//se cierra arch2
fclose(Archivo2);//se cierra arch1

printf("Gracias, vuelva pronto.\n");
system("\n PAUSE");
}


eso ojala alguien me ayude.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:error con orednamento de un arreglo en 2 ficher

Publicado por Capitan Kirk (94 intervenciones) el 26/04/2010 09:00:58
El problema lo tienes en el bucle de lectura del archivo. Haces:

while (!feof(Archivo1))
{
fread(arg1,sizeof(char),11,Archivo1);
// ...
}

Al leer la última línea del archivo de entrada, aún no ha leído la marca de final de fichero, con lo que ejecuta el bucle una vez más. En esta vez extra, es cuando lee la marca de fin de fichero, pero te conserva el último valor leído, y efectúa el correspondiente procesado, que es por lo que te repite la última entrada.

La solución es sencilla:

while (!feof(Archivo1))
{
fread(arg1,sizeof(char),11,Archivo1);
if (feof(Archivo1)) break;
// ...
}

Así, una vez que lea la marca de final de archivo, saldrá del bucle while directamente (sentencia break), y no te repetirá la última línea.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error con orednamento de un arreglo en 2 ficher

Publicado por NicoKratos (6 intervenciones) el 26/04/2010 17:25:18
se que sonara un poco gay, pero capitan kirk te amo!! estaba sufriendo con el codigo desde hace un poco mas de 2 semanas. si bine era algo sencillo no solo me solucionaste el problema si no que hata aprendi algo nuevo, de corazon gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar