Duda al escribir ficheros

Iniciado por Feynmann, 23 Marzo 2014, 16:03 PM

0 Miembros y 2 Visitantes están viendo este tema.

Feynmann

Perfecto, lo he notado muchísimo! Gracias amchacon!

Solo veo un defecto y es serio! : Me está cogiendo cada dos numeros, es decir los numeros impares en posicion de fila no me los coge, lo que no se por que!  :-[

Código (cpp) [Seleccionar]
//programa para obtener archivos y modificarlos guardandolos en nuevos archivos.
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <fstream>

using namespace std;

int main(){

    FILE *fichero;
FILE *fichero2;

   char nombre[11] = "datos.txt";
   char nombre2[11]= "salida.txt";

   fichero = fopen( nombre, "r" );  // Fichero datos.txt desde el que leo los datos.
   fichero2= fopen( nombre2, "w");  // Fichero salida.txt donde escribire los datos.

   if ( fichero == NULL ) {
      printf( "Fichero '%s' no se pudo abrir.\n", nombre ); /* error */
      return -1;
}
   if ( fichero2 == NULL ) {
      printf( "Fichero '%s' no se pudo abrir.\n", nombre2 ); /* error */
      return -1;
}

char leer[1000];
double numero,numerof;

while (fgets(leer, 1000, fichero) != NULL) //detecta cuando acaba la informacion del fichero datos.txt
{                                         
fgets(leer,1000,fichero); //lee una linea del fichero , la guarda en leer y pasa a la siguiente linea
numero = atof (leer);// convierto un char en un int
//Aqui hago las modificaciones
numerof = numero*1;
sprintf(leer, "%f\n",numerof); // convierto double a string
// Escribo lo anterior al fichero2
fputs(leer,fichero2);
}
fclose(fichero);  //cierra fich datos.txt
fclose(fichero2);

getchar();
return 0;
}
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

eferion


while (fgets(leer, 1000, fichero) != NULL) //detecta cuando acaba la informacion del fichero datos.txt
{                                         
fgets(leer,1000,fichero); //lee una linea del fichero , la guarda en leer y pasa a la siguiente linea


dos fgets seguidos?? con esto estas perdiendo la primera lectura.

Feynmann

Ostras vale,
pense que dentro del while no se ejecutaba nada.. jojo
entonces ya está perfecto!!
entendi mal a amchacon!!

Gracias de nuevo!  ;D
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

rir3760

#23
Cita de: Feynmann en 25 Marzo 2014, 09:13 AMcon toda esta información me funciona la meta que tenia como programilla que quiero hacer, no lo he acabado aún pero quiza sigo posteando aqui dudas.
Lo primero que debes hacer es decidir que lenguaje vas a aprender, si este es C++ enfocate en el sin mezclarlo con C.

Cita de: Feynmann en 25 Marzo 2014, 09:13 AM-El programa recibe un dichero datos.txt que es de una sola columna y que es de este tipo:
    611.1118
    611.6466
    612.8956
    611.8088
    615.3070
    614.8684
    ....ETC... (hasta 20K datos así)
-Este programa recoge este fichero, yo modifico (en este caso con una multiplicación) estos datos (pasandolos a int previamente)  y los multiplico por dos por ejemplo y luego volviendolos a convertir.
-Por ultimo recibo un fichero salida.txt como el siguiente:
1222.223600
1223.293200
1225.791200
1223.617600
1230.614000
1229.736800
1232.356000
...ETC...(Así hasta los 20k datos)
Si tienes garantizada la estructura del archivo de entrada no tienes porque utilizar fgets para leer una linea ya que lo único que haces con ella es extraer el valor numérico. Este lo puedes obtener directamente con fscanf, de forma similar puedes imprimirlo con fprintf en lugar del par sprintf + puts.

El programa en C con esos y otros cambios:
#include <stdio.h>
#include <stdlib.h>

#define NAME_IN   "datos.txt"
#define NAME_OUT  "salida.txt"

int main(void)
{
   FILE *in;
   FILE *out = NULL;
   int rv = EXIT_FAILURE;
   double num;
   
   if ((in = fopen(NAME_IN, "r")) == NULL)
      perror(NAME_IN);
   else if ((out = fopen(NAME_OUT, "w")) == NULL)
      perror(NAME_OUT);
   else {
      while (fscanf(in, "%lf", &num) == 1 && fprintf(out, "%f\n", num * 2.0) >= 0)
         ;
     
      if (!ferror(in) && !ferror(out))
         rv = EXIT_SUCCESS;
   }
   
   if (in != NULL)
      fclose(in);
   if (out != NULL)
      fclose(out);
   
   return rv;
}


Editado: faltaba un carácter '=' en la condición del bucle, ya esta corregido

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

Feynmann

#24
El problema que la estructura de datos no siempre es la misma, creo que me quedaré con lo que ya tengo.

Otro tema, llevo buscando un buen rato y no encuentro nada.

Si en vez de los ficheros en .txt los tengo en un excell, que funcion debo utilizar para exportar los datos tal y como he hecho a lo largo del hilo?

Un saludooo




El problema que la estructura de datos no siempre es la misma, creo que me quedaré con lo que ya tengo.

Otro tema, llevo buscando unos dias y no se por donde empezar!

Si en vez de los ficheros en .txt los tengo en un excell, que funcion debo utilizar para exportar los datos tal y como he hecho a lo largo del hilo?

Un saludooo
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

amchacon

Copia y pega la columna del excel en un txt.

PD: El excel es un formato de Microsoft office, tienes dos opciones:

- Estudiarte como esta estructurado. Y entonces lo lees a pelo con fread().
- Usar una librería de terceros que ya haya hecho ese trabajo por ti (desconozco si existe, pero no creo exista una gratis al ser un formato no-libre).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Cita de: amchacon en 31 Marzo 2014, 13:01 PM
Copia y pega la columna del excel en un txt.

PD: El excel es un formato de Microsoft office, tienes dos opciones:

- Estudiarte como esta estructurado. Y entonces lo lees a pelo con fread().
- Usar una librería de terceros que ya haya hecho ese trabajo por ti (desconozco si existe, pero no creo exista una gratis al ser un formato no-libre).

Microsoft tiene una API que permite leer y escribir en ficheros Excel, lo que pasa es que la que yo conozco está preparada para .NET. Desconozco si dispone de un homólogo para C o C++... eso si, con el wrapper adecuado se puede hacer funcionar en C++ nativo sin problemas.

Con respecto al formato... desde 2007 los formatos de excel cambiaron su extensión a xlsx. Este formato es, en realidad, un fichero comprimido (con zip creo recordar). En su interior se encuentran varios archivos xml que contienen los datos de la configuración del libro y del contenido de las diferentes hojas.

Feynmann

Dios mio.. vaya trabajo me espera..
Resulta que los Excell tienen varias hojas y además muchisimos datos, a mano es imposible.

voy a ver si encuentro algo.. uff :(

Muchísimas gracias por comentarme las alternativas.
Da gusto este foro, sin duda. El día que pueda aportar yo algo lo haré..  :rolleyes:
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

amchacon

Ya no uso excel desde hace tiempo pero... ¿No se puede exportar todo el contenido como cadena de texto?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Feynmann

Como cadena de texto, no entiendo. Para que te imagines los archivos son del tipo

Un archivo Excell con muchas hojas, y en cada hoja 3 columnas con datos.

Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!