Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: fafafa01 en 16 Mayo 2016, 00:11 am



Título: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 16 Mayo 2016, 00:11 am
Hola como bien dice el titulo, tengo un archivo .txt así:
45,678
67,890

y yo quiero que queden así:
45.678
67.890

mi idea es, aprovechando que se que el caracter 8 en ascii es retroceso , el 44 la coma y el 46 el punto hacer esta función:
Código:
#include <stdio.h>
#include <stdlib.h>

void main (void) {
FILE *archivo;
int c;

archivo=fopen("varx.txt","r+");
c=fgetc(archivo);
while (c != EOF) {
if (c==44) {
fputc(8,archivo);
fputc(46,archivo);
}
c=fgetc(archivo);
}
fclose(archivo);
}

el problema es que el archivo no se modifica, si alguien sabe que es lo que esta mal en el código y me lo dice me serviría de mucho, saludos.


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: MAFUS en 16 Mayo 2016, 00:25 am
En vez de usar números mágicos utiliza directamente los caracteres entre comillas simples.
Por otra parte, en vez de intentar ir a atrás insertando el carácter de control '\b' directamente atrasa una posición el puntero del archivo.

Con todo esto el código queda como sigue:
Código
  1. if (c==',') {
  2.    fseek(archivo, -1, SEEK_CUR);
  3.    fputc('.',archivo);
  4. }


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 16 Mayo 2016, 00:45 am
No logro poder modificarlo.


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fary en 16 Mayo 2016, 09:39 am
Hola como bien dice el titulo, tengo un archivo .txt así:
45,678
67,890

y yo quiero que queden así:
45.678
67.890


¿Cual se supone que es la diferencia despues de modificar el archivo?



Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 16 Mayo 2016, 14:49 pm
cambiar la coma por el punto.

¿Cual se supone que es la diferencia despues de modificar el archivo?




Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: Kaxperday en 16 Mayo 2016, 15:06 pm
Buenas, si he entendido bien lo que quieres es leer el contenido del archivo y sustituir su contenido por el mismo pero cambiando solo las comas por puntos.

Con el código de MAFUS debería bastar, porque el fputc() sobreescribe el valor que se encuentra en esa posición. Cada fgetc() mueve el puntero una posición adelante para continuar leyendo, cuando encuentras una ',' usas fseek(archivo, -1, SEEK_CUR) para que vuelva atrás y no pase al siguiente caracter y entonces con fputc('.',archivo), escribes '.' en la posición de la ',' por lo que quedaría sobreescrita.

Si es un fichero de texto entonces no lo abras como binario usa "rt" en vez de "r+".

Un saludo.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void main (void) {
  5. FILE *archivo;
  6. int c;
  7.  
  8. archivo=fopen("varx.txt","rt");
  9. c=fgetc(archivo);
  10. while (c != EOF) {
  11. if (c==',') {
  12.               fseek(archivo, -1, SEEK_CUR);
  13.               fputc('.', archivo);
  14. }
  15. c=fgetc(archivo);
  16. }
  17. fclose(archivo);
  18. }
  19.  


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 16 Mayo 2016, 17:02 pm
Muchas gracias, creo que el error entonces seria que use el "r+". saludos.


Buenas, si he entendido bien lo que quieres es leer el contenido del archivo y sustituir su contenido por el mismo pero cambiando solo las comas por puntos.

Con el código de MAFUS debería bastar, porque el fputc() sobreescribe el valor que se encuentra en esa posición. Cada fgetc() mueve el puntero una posición adelante para continuar leyendo, cuando encuentras una ',' usas fseek(archivo, -1, SEEK_CUR) para que vuelva atrás y no pase al siguiente caracter y entonces con fputc('.',archivo), escribes '.' en la posición de la ',' por lo que quedaría sobreescrita.

Si es un fichero de texto entonces no lo abras como binario usa "rt" en vez de "r+".

Un saludo.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void main (void) {
  5. FILE *archivo;
  6. int c;
  7.  
  8. archivo=fopen("varx.txt","rt");
  9. c=fgetc(archivo);
  10. while (c != EOF) {
  11. if (c==',') {
  12.               fseek(archivo, -1, SEEK_CUR);
  13.               fputc('.', archivo);
  14. }
  15. c=fgetc(archivo);
  16. }
  17. fclose(archivo);
  18. }
  19.  



tampoco me anda   :( :( :( :(

Muchas gracias, creo que el error entonces seria que use el "r+". saludos.




Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: Kaxperday en 16 Mayo 2016, 19:31 pm
Haz el favor, prueba el código que puse y dime si anda.

Postea el nuevo código, NO solo cambia el "r+" sino más cosas.

En caso de que no funcione dinos cual es el mensaje de error y si no le hay verifica que el archivo se abre correctamente.

Saludos.


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 16 Mayo 2016, 21:32 pm
no me tira ningún error, es como que se cuelga y tengo que cerrar el programa con ctrl+c.

acá el código:

Código:
#include <stdio.h>
#include <stdlib.h>

void main (void) {
FILE *archivo;
int c;

archivo=fopen("varx.txt","rt");
if (archivo == NULL){

printf("\nError de apertura del archivo. \n\n");
}
else {
c=fgetc(archivo);
while (c != EOF) {
if (c==',') {
    fseek(archivo, -1, SEEK_CUR);               
fputc('.',archivo);
}
c=fgetc(archivo);
}
}
fclose(archivo);
}


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: ivancea96 en 16 Mayo 2016, 22:01 pm
Coloca fflush después de una operación de escritura si luego vas a hacer otra lectura. Además, es preferible que utilices r+, pues la 't' no siempre stá soportdada, y en este caso, realmente no va a cambiar nada.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5. FILE *archivo;
  6. int c;
  7.  
  8. archivo=fopen("asd.txt","r+");
  9. if (archivo == NULL){
  10. printf("\nError de apertura del archivo. \n\n");
  11. }
  12. else {
  13. c=fgetc(archivo);
  14. while (c != EOF) {
  15. if (c==',') {
  16. fseek(archivo, -1, SEEK_CUR);
  17. fputc('.',archivo);
  18. fflush(archivo);
  19. }
  20. c=fgetc(archivo);
  21. }
  22. }
  23. fclose(archivo);
  24. }


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 17 Mayo 2016, 01:39 am
muchas gracias, me funciono perfecto.

¿sabes porque es necesario colocar fflush? estuve viendo y esta función lo que hace es borrar el buffer creo.

¿si la lectura y escritura es sobre una pantalla también se debe hacer?

 y la ultima, ¿porque, en el ejemplo que vimos  hay que retroceder un byte de la posición actual? si técnicamente el puntero esta apuntando al caracter que queremos cambiar.

saludos.

Coloca fflush después de una operación de escritura si luego vas a hacer otra lectura. Además, es preferible que utilices r+, pues la 't' no siempre stá soportdada, y en este caso, realmente no va a cambiar nada.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5. FILE *archivo;
  6. int c;
  7.  
  8. archivo=fopen("asd.txt","r+");
  9. if (archivo == NULL){
  10. printf("\nError de apertura del archivo. \n\n");
  11. }
  12. else {
  13. c=fgetc(archivo);
  14. while (c != EOF) {
  15. if (c==',') {
  16. fseek(archivo, -1, SEEK_CUR);
  17. fputc('.',archivo);
  18. fflush(archivo);
  19. }
  20. c=fgetc(archivo);
  21. }
  22. }
  23. fclose(archivo);
  24. }


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 17 Mayo 2016, 02:18 am
otra duda, al final el código lo tuve que cambiar, porque solo en la primer linea me imprimía bien, quedaba así:
12,345
23.,456
56.,678


Código:
#include <stdio.h>
#include <stdlib.h>

void main (void) {
FILE *archivo;
int c,i;

archivo=fopen("datalog1","r+");
if (archivo == NULL){

printf("\nError de apertura del archivo. \n\n");
}
else {
c=fgetc(archivo);
i=1;
while (c != EOF) {
if ((c==',') && (i==1)){
i=2;
    fseek(archivo, -1, SEEK_CUR);   
fputc('.',archivo);
fflush(archivo);
}
else if ((c==',') && (i==2)) {
fseek(archivo, -2, SEEK_CUR);   
fputc('.',archivo);
fflush(archivo);
}
c=fgetc(archivo);
}
}
fclose(archivo);
}

igualmente tampoco anda a la perfección, los últimos números tampoco los imprime bien, no se si sera porque el archivo es muy grande o que (el archivo es de 1600 lineas aprox)


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: ivancea96 en 17 Mayo 2016, 02:21 am
fflush vacía el buffer, que vienen siendo 2 pasos: Primero, enviar los datos a su destino (el archivo en este caso), y segundo, limpiarlo. Para evitar que vaya lento, cada operación como fputc en evz de escribir al archivo, lo va almacanando en el buffer. Con fflush, grabamos lo almacenado.

Si es sobre pantalla también se debe? Pues según. Si vas a pedir entrada al usuario, generalmente el fflush no es necesario, se hace automáticamente. Pero si vas a tener a tu programa trabajando continuamente (Por ejemplo, listando todos lso archivos de una carpeta), entonces sí es preferible ahcer fflush. Pero no cadaescritura, sino cada "bloque" de texto qeu quieras que salga junto a la pantalla. Pero por lo general, no será necesario. Eso sí, si en algún momento ves que no sale texto por pantalla que debería salir, prueba poniendo flush.

Tanto fputc como fgetc avanza 1 posición en el archivo. Cuando fgetc() retorna ',', ya no está en ese caracter, sino en el siguiente. Entonces, retrocedes uno, y lo reescribes con fputc.

Con respecto a lo que acabas de comentar, ¿qué te genera el código que puse antes?


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 17 Mayo 2016, 03:05 am
con tu codigo
esta así:
0.0000
77.725
146.327
199.039
230.767
235.482
215.951
171.428
108.204
34.306
-44.094
-118.699
-178.576


queda así:
0,0000
77.,725
146.,327
199.,039
230.,767
235.,482
215.,951
171.,428
108.,204
34.,306
-44.,094
-118.,699
-178.,576

y en las ultimas lineas simplemente no modifica nada

tengo que aclarar que el archivo no es .txt sino que es un archivo de texto que no tiene especificado el tipo de archivo que es. obviamente no le puse "asd.txt" sino simplemente "asd" (aunque no se si esta bien).


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: ivancea96 en 17 Mayo 2016, 13:25 pm
Extraño. ¿Usas Windows, Linux?


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 17 Mayo 2016, 14:37 pm
windows uso

Extraño. ¿Usas Windows, Linux?


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: ivancea96 en 17 Mayo 2016, 15:00 pm
Utiliza este código:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5. FILE *archivo;
  6. int c;
  7.  
  8. archivo=fopen("asd.txt","r+");
  9. if (archivo == NULL){
  10. printf("\nError de apertura del archivo. \n\n");
  11. }
  12. else {
  13. c=fgetc(archivo);
  14. while (c != EOF) {
  15. if (c==',') {
  16. printf("%i ", ftell(archivo));
  17. fseek(archivo, -1, SEEK_CUR);
  18. printf("%i ", ftell(archivo));
  19. fputc('.',archivo);
  20. fflush(archivo);
  21. printf("%i\n", ftell(archivo));
  22. }
  23. c=fgetc(archivo);
  24. }
  25. }
  26. fclose(archivo);
  27. }

Le añadí unos printf para comprobar que la posición del cursor varíe correctamente.
Te debería salir por pantalla los valores:
"N N-1 N"


Título: Re: Cambiar coma por punto en un archivo .txt
Publicado por: fafafa01 en 17 Mayo 2016, 15:32 pm
pone números como vos decís:" N N-1 N ", pero no se detiene nunca.
empieza con "11 10 11"