Necesito algunos consejos para mejorar la lectura y escritura de ficheros en C

Iniciado por DarkSorcerer, 24 Enero 2014, 02:47 AM

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

DarkSorcerer

Para repasar en programación en C, quise crear un programa que consiste en escribir un fichero de texto, para despues leerlo, tengo unas advertencias que tienen que ver con el comando exit(1), además, ¿ Existe alguna forma de escribir en el fichero cada vez que se teclea el caracter sin apretar ENTER ?, me gustaría poder escribir en el fichero a medida que tecleo el caracter y si hay una equivocacón, borrarlo del fichero, además había propuesto que el fichero pudiera escribir cadenas de tal manera que incluya los espacios en blanco. Un pequeño problema es cuando se lee el fichero, al final de la ultima linea aparece un caracter extraño, por ejemplo, me aparece esto

Escriba su oracion: Hola soy Goku, y esta sera mi gran batalla.


Fichero escrito exitosamente.

Comenzando lectura del fichero:

Hola soy Goku, y esta sera mi gran batalla.ÿ

RUN SUCCESSFUL (total time: 17s)



Y otro problema estético que tengo es que cuando escribo mi oración por medio del teclado, si me equivoque en una palabra, al momento de borrar aveces no me borrar de la pantalla las letras que quiero eliminar, si no que el cursor se desplaza hacia atras sin borrar, solo para sobrescribir.

/*
* File:   main.c
* Author: Rodrigo Pizarro
*
* Este programa permite escribir y leer ficheros de texto.
*
* Created on 23 de enero de 2014, 09:55 PM
*/

#include <stdio.h>
#include <ctype.h>

FILE *ficheroEscritura;
FILE *ficheroLectura;

/**
* Funcion que permite preparar y abrir el fichero para su lectura.
*/

void prepararLectura(){
 
   ficheroLectura = fopen("fichero.txt","r");
   
   if(ficheroLectura == NULL){
       
       printf("\n\nError: Fichero de lectura no encontrado o roto, se cerrara el programa.");
       exit(1);
       
   }
   
}

/**
* Funcion que permite preparar y abrir el fichero para su escritura.
*/

void prepararEscritura(){
   
   ficheroEscritura = fopen("fichero.txt","w");
   
   if(ficheroEscritura == NULL){
       
       printf("\n\nNo se pudo crear el archivo de lectura, se cerrara el programa.");
       exit(1);
       
   }
   
}

/**
* Funcion que permite leer caracter por caracter un fichero e imprimirlo por
* la pantalla.
*/

void leerFichero(){
   
   char letra;
   
   printf("\n\nComenzando lectura del fichero:\n\n");
   
   while(!feof(ficheroLectura)){
       
       letra = getc(ficheroLectura);
       
       if(isspace(letra)){
           
           printf(" ");
           
       }else{
           
           printf("%c",letra);
           
       }
       
   }
   
   fclose(ficheroLectura);
   
}

/**
* Funcion que permite escribir caracter a caracter en el fichero.
*/

void escribirFichero(){
   
   printf("Escriba su oracion: ");
   
   char cadena[140];
   gets(cadena);
   
   fputs(cadena,ficheroEscritura);
   
   if(fclose(ficheroEscritura) == 0){
       
       printf("\n\nFichero escrito exitosamente.");

   }else{
       
       printf("\n\nError: No se pudo cerrar el fichero.");
       
   }
   
}

int main(){
   
   prepararEscritura();
   escribirFichero();
   prepararLectura();
   leerFichero();
   
   getchar();
   return 0;
   
}

rir3760

Cita de: DarkSorcerer en 24 Enero 2014, 02:47 AM¿ Existe alguna forma de escribir en el fichero cada vez que se teclea el caracter sin apretar ENTER ?
Con la biblioteca estándar de C no es posible, se puede utilizando extensiones como bibliotecas de terceros (por ejemplo ncurses) o el API del SO (por ejemplo Win32).

Cita de: DarkSorcerer en 24 Enero 2014, 02:47 AMUn pequeño problema es cuando se lee el fichero, al final de la ultima linea aparece un caracter extraño
Eso sucede porque en la función "leerFichero" el bucle para la lectura es controlado por la función feof y el uso de esta ultima (salvo excepciones) no se recomienda. También debes cambiar el tipo de la variable "letra" para que coincida con el tipo de la función getc (el tipo de retorno de esta es "int").

Si se modifica esa función a:
void leerFichero(void)
{
   int letra;
   
   puts("Comenzando lectura del fichero:");
   while ((letra = getc(ficheroLectura)) != EOF)
      putchar(letra);

   fclose(ficheroLectura);
}

El texto debe presentarse sin el carácter adicional.

Por ultimo debes evitar en lo posible el uso de variables "globales", en su lugar pasa los valores necesarios como argumentos a la función.

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