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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema para continuar un programa con ficheros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema para continuar un programa con ficheros  (Leído 2,006 veces)
Pol23

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Problema para continuar un programa con ficheros
« en: 30 Septiembre 2018, 15:23 pm »

Hola,

Tengo un ejercicio en el que me piden copiar el contenido de un fichero a otro con 3 opciones:

a) copiar a en b tal cual
b) copiar a en b pero invirtiendo línea a línea, ejemplo:
    fichero a: 12345
                   abcde
    fichero b: 54321
                   edcba
c) copiar a en b pero invirtiendo todo el orden:
    fichero b: edcba
                   54321

¿podría poner un for después del while que fuera al revés (desde el final del fichero al principio) y lo fuera escribiendo?
O habría que hacer una función entre el main y el copiar que sea "invertir"?

Gracias


« Última modificación: 30 Septiembre 2018, 16:00 pm por Pol23 » En línea

Pol23

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Copiar contenido de un fichero a otro a)invirtiendo líneas b) invirtiendo todo.
« Respuesta #1 en: 30 Septiembre 2018, 15:54 pm »

He mejorado un poco el código para que me invierta las líneas, el problema es que solo consigo sacarlo por pantalla, cuando lo hago en un fichero, o hago bucles infinitos o no muestra lo que necesito
Además, me gustaría que el for del i fuera desde 0 hasta cualquier número y no hasta 50 (valor que he puesto por poner) ¿es esto posible?

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

#define MAX_CHARS  4096

int copiar(char* f_in,char* f_out);
char *invertir(char linea[]);

int main()
{
FILE *infile; //para rw un fichero

if(!copiar("input2_2.txt","input2_2.txt.out"))
                printf("input2_2.txt se ha copiado con éxito\n");
else
printf("input2_2.txt no pudo copiarse\n");
  return 0;
}

char *invertir(char linea[])
{
   int i;
   int j;
   int longitud;
   char aux;
  
   longitud = strlen(linea);
   for (i = 0, j = longitud - 1; i < j; i++, j--){
      aux = linea[i];
      linea[i] = linea[j];
      linea[j] = aux;
   }
  
   return linea;
}

int copiar(char* f_in,char* f_out)
{
FILE *fp_in,*fp_out;
char c, linea[MAX_CHARS];
int i, j;
 
if(!(fp_in=fopen(f_in,"rt")) || !(fp_out=fopen(f_out,"wt")))
{  
perror("Error en la apertura de ficheros, input2_2.txt no pudo copiarse");
exit(EXIT_FAILURE);
}
 
while((c=fgetc(fp_in))!=EOF && !ferror(fp_in) && !ferror(fp_out)){//EOF=end of file
for (i = 1 ; i < 50; i++){
          while (fgets(linea, MAX_CHARS, fp_in) != NULL){
               /* Buscamos y descartamos el avance de linea */
               for (j = 0; linea[j] != '\0' && linea[j] != '\n'; j++)
                  ;
               if (linea[j] == '\n')
                  linea[j] = '\0';

               printf("%s\n", invertir(linea));
            }
         }
 }
if(ferror(fp_in) || ferror(fp_out))
return 1;
 
fclose(fp_in);
fclose(fp_out);
return 0;
}


En línea

Pol23

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Copiar contenido de un fichero a otro a)invirtiendo líneas b) invirtiendo todo.
« Respuesta #2 en: 30 Septiembre 2018, 16:11 pm »

He mejorado un poquito más el código para que me invierta las líneas, el problema es que no me lo crea bien, se come el primer carácter y tengo un salto de línea de más

Código:
El principio es igual, solo cambia "copiar"

int copiar(char* f_in,char* f_out)
{
FILE *fp_in,*fp_out;
char c, linea[MAX_CHARS];
int i, j;
 
if(!(fp_in=fopen(f_in,"r")) || !(fp_out=fopen(f_out,"w")))
{   
perror("Error en la apertura de ficheros, input2_2.txt no pudo copiarse");
exit(EXIT_FAILURE);
}
 
while((c=fgetc(fp_in))!=EOF && !ferror(fp_in) && !ferror(fp_out))
{
for (i = 0 ; i < 50; i++)
{
while (fgets(linea, MAX_CHARS, fp_in) != NULL)
{
for (j = 0; linea[j] != '\0' && linea[j] != '\n'; j++)
if (linea[j] == '\n')
linea[j] = '\0';
fprintf(fp_out,"%s", invertir(linea));
            }
          }
}

if(ferror(fp_in) || ferror(fp_out))
return 1;
 
fclose(fp_in);
fclose(fp_out);
return 0;
}
« Última modificación: 30 Septiembre 2018, 19:09 pm por Pol23 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema para continuar un programa con ficheros
« Respuesta #3 en: 30 Septiembre 2018, 21:42 pm »

Esta es mi idea. No tiene control de errores, sólo funcionalidad básica. Probado bajo Windows, en Linux necesitaría de algunos cambios:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char *arch_original = "original.txt";
  5. char *arch_copia = "copia.txt";
  6.  
  7. int menu() {
  8.    int retval;
  9.  
  10.    puts("1. Copiar a en b tal cual");
  11.    puts("2. Copiar a en b pero invirtiendo linea a linea");
  12.    puts("3. Copiar a en b pero invirtiendo todo el orden");
  13.    puts("0. Salir");
  14.    puts("");
  15.    printf("Eleccion: ");
  16.    scanf("%d", &retval);
  17.  
  18.    return retval;
  19. }
  20.  
  21. void reiniciar_archivo() {
  22.    FILE *fp = fopen(arch_original, "wt");
  23.    fprintf(fp, "12345\nabcde");
  24.    fclose(fp);
  25. }
  26.  
  27. void opcion_1() {
  28.    int c;
  29.    FILE *original = fopen(arch_original, "rt");
  30.    FILE *copia = fopen(arch_copia, "wt");
  31.  
  32.    c = fgetc(original);
  33.    while(!feof(original)) {
  34.        fputc(c, copia);
  35.        c = fgetc(original);
  36.    }
  37.  
  38.    fclose(original);
  39.    fclose(copia);
  40. }
  41.  
  42. void opcion_2() {
  43.    char buffer[4096];
  44.    char c;
  45.    int tam;
  46.    FILE *original = fopen(arch_original, "rt");
  47.    FILE *copia = fopen(arch_copia, "wt");
  48.  
  49.    c = fgetc(original);
  50.    while(!feof(original)) {
  51.        ungetc(c, original);
  52.  
  53.        fscanf(original, "%4096[^\n]%n", buffer, &tam);
  54.        for(int i=tam-1; i>=0; --i)
  55.            fputc(buffer[i], copia);
  56.  
  57.        if((buffer[0] = fgetc(original)) == '\n')
  58.            fputc(buffer[0], copia);
  59.        else
  60.            ungetc(buffer[0], original);
  61.  
  62.        c = fgetc(original);
  63.    }
  64.  
  65.    fclose(original);
  66.    fclose(copia);
  67. }
  68.  
  69. void opcion_3() {
  70.    int c;
  71.    FILE *original = fopen(arch_original, "rt");
  72.    FILE *copia = fopen(arch_copia, "wt");
  73.  
  74.    fseek(original, -1, SEEK_END);
  75.  
  76.    c = fgetc(original);
  77.    while(ftell(original)>1) {
  78.        fputc(c, copia);
  79.        fseek(original, c=='\n'? -3 : -2, SEEK_CUR);
  80.        c = fgetc(original);
  81.    }
  82.    fputc(c, copia);
  83.  
  84.    fclose(original);
  85.    fclose(copia);
  86. }
  87.  
  88. int main() {
  89.    int n;
  90.  
  91.    do {
  92.        reiniciar_archivo();
  93.        n = menu();
  94.  
  95.        switch(n) {
  96.        case 0:
  97.            break;
  98.        case 1:
  99.            opcion_1();
  100.            break;
  101.        case 2:
  102.            opcion_2();
  103.            break;
  104.        case 3:
  105.            opcion_3();
  106.            break;
  107.        default:
  108.            puts("La opcion elegida no es correcta.");
  109.        }
  110.  
  111.        // Mira el resultado en el archivo copia.txt
  112.  
  113.    } while(n);
  114. }
« Última modificación: 1 Octubre 2018, 00:33 am por MAFUS » En línea

Pol23

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema para continuar un programa con ficheros
« Respuesta #4 en: 5 Octubre 2018, 14:04 pm »

Hola Mafus

He copiado tal cual tu programa y cuando lo ejecuto sale el menú de opciones, ninguna de las 3 opciones funciona correctamente, viendo el archivo copia.tx:

Opción 1
12345
abcde

Opción 2
54321
edcba

Opción 3
edcba
4321

Así que casi lo hace pero se come una línea (ya que mi fichero de entrada tiene 3 filas) y en todos los casos también se come caracteres, ya que las letras van hasta la J

Saludos
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema para continuar un programa con ficheros
« Respuesta #5 en: 5 Octubre 2018, 19:38 pm »

A mi me va bien. Incluso para Linux sólo he tenido que eliminar 'c=='\n'? -3 : '.
En línea

KnifeSkiLLs

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Problema para continuar un programa con ficheros
« Respuesta #6 en: 9 Octubre 2018, 13:52 pm »

Pol, en el enunciado de la evaluacion continua que pretendes llevar a cabo se te indica que el número de lineas y de caracteres por linea es aleatorio. Este ejercicio se hace muy facilmente con fgets y fprints, creando un string de chars de un tamaño grande y una funcion que invierta las cadenas que leas. Ademas, en el tercer apartado, puedes utilizar un array de strings para ir almacenando las lineas invertidas por orden. Vamos, es lo que yo haria
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa para editar ficheros exe « 1 2 »
Ingeniería Inversa
consejo 11 28,425 Último mensaje 11 Marzo 2008, 08:20 am
por Shaddy
Programa batch para actualizar ficheros por Internet
Scripting
meriadoc2002 2 4,305 Último mensaje 14 Septiembre 2007, 10:18 am
por ROSITAAA
problema con programa de ficheros en c
Programación C/C++
Quake-man 1 2,530 Último mensaje 10 Septiembre 2010, 18:39 pm
por nicolas_cof
API para que el programa detecte si esta abierto un proceso antes de continuar
Programación Visual Basic
Franqox 9 9,683 Último mensaje 23 Diciembre 2010, 20:54 pm
por BlackZeroX
problema con un programa para el insti
Programación C/C++
Alberto rozas 1 3,013 Último mensaje 15 Marzo 2021, 12:17 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines