Duda al escribir ficheros

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

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

Feynmann

Buenas tardes,
Presentare mi codigo y a continuación las dudas , (He buscado en google y en este foro, lo he intentado pero no me acabo de aclarar)


Lo primero de todo, estoy intentado hacer un programa que recoja datos de un fichero (hago modificaciones oportunas) y me los escribe en otro, para ello he empezado por algo facilito para entenderlo.
Código (cpp) [Seleccionar]


#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

int main(){

/*Leo fichero datos*/
ifstream fin("datos.txt"); // Situando un cursor al inicio del fichero
string nombre;
int numero;
fin >> nombre >> numero; // los datos se obtienen del fichero txt

/*Escribo fichero salida.txt*/

ofstream fout("salida.txt");
fout << nombre << " " << numero*2;

getchar();
return 0;
}


Preguntas:
1) No me reconoce el string, y me obliga a crear una variable tal que char nombre[10] por ejemplo. ¿Que le falta a mi codigo?

2) He conseguido hacer que me lea una linea del fichero .txt que es de la siguiente forma:

Felipe 14

Como puedo conseguir que me lea con saltos de linea, es decir que me lea un fichero de este tipo

felipe 14
Marcos 15
Duna 0129

He estado mirando y no se que funcion o que usar! :(

3)
Igual que la pregunta 2, pero para escribirlo en el fichero.

A ver si me podeis decir por donde van los tiros y lo sigo intentando. Gracias!! :)
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

1º ¿No te reconoce el string? Pues sintácticamente está correcto Oo

2º Para leer líneas enteras se usa getline:
Código (cpp) [Seleccionar]
getline(archivo,string);

También se puede leer directamente por read():
http://www.cplusplus.com/reference/istream/istream/read/

Esa es una lectura literal.

3º Escribe las líneas que vas leyendo. Puedes los saltos de línea que creas necesario.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Cita de: Feynmann en 23 Marzo 2014, 16:03 PMNo me reconoce el string, y me obliga a crear una variable tal que char nombre[10] por ejemplo. ¿Que le falta a mi codigo?
Antes de utilizar la clase string debes incluir el encabezado correspondiente con:
Código (cpp) [Seleccionar]
#include <string>

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

amchacon

¿Seguro? A mi siempre me lo coge con iostream.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Cita de: amchacon en 23 Marzo 2014, 17:28 PM¿Seguro? A mi siempre me lo coge con iostream.
Revisando el tema lo usual, como bien indicas, es que funcione pero para estar completamente seguros mejor incluir el encabezado.

Una discusión sobre ello en comp.lang.c++.moderated es Is the string header file required?.

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

Perfecto, muchas gracias.

Efectivamente, se necesita el encabezado.
por otro lado, probare la funcion getline, y os digo si sigo teniendo problemas!

Un saludo!
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

Por cierto es importante distinguir entre lectura en modo texto y lectura binaria.

Lo que estás haciendo ahí es lectura en modo texto, el programa lee las cifras y las interpreta.

Pero también cabe guardar la cifra a "palo seco":
Código (cpp) [Seleccionar]
int b;

ofstream escritura("texto.bin");
escritura.write((char*) &b,sizeof(int));


Si abrimos el archivo con un bloc de notas no veremos nada pero ahí está el número guardado.

Leyendolo sería parecido:
Código (cpp) [Seleccionar]
int b;

ifstream escritura("texto.bin");
escritura.read((char*) &b,sizeof(int));


Este modo de lectura es "más natural" para el programa, los datos suelen ocupar menos espacio y la lectura y escritura es más rápida (ya que no tienen que reinterpretarlo como texto).

¿Cual usar? Pues depende de tus necesidades por supuesto, si quieres que el archivo pueda ser leído por humanos entonces usa los operadores >> y << que has usado antes.

Para ser leído por programas es mejor esta opción.
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

amchacon, me viene de perlas que me pre-avises!

Te comento para que lo necesito y me aconsejas, para empezar no soy estudiante, estoy trabajando y trabajo con archivos de txt llenos de columnas de datos, te hablo de columnas que van de 32K a 200K datos.

Lo que quiero hacer es extraerlos, aplicarles ciertas formullillas y meterlos en otro .txt

Me aconsejas entonces que lo haga en binario? Aunque has de saber que:
El .txt inicial esta en ASCII y el final tambien lo debe de estar...

Es decir, ASCII->Binario- modifico en binario -> ASCII es lo que me aconsejas?
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

Si trabajas con ficheros txt llenos de datos olvida lo que he dicho y procede como siempre.

¿Razón? Pues que no tienes los números en binario sino en formato ASCII.
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

Bueno, he estado trasteando y a parte de modificarlo todo creo que me he liado más, os comento:

El objetivo del programa es leer columnas con muchisimos datos de un Datos.txt, (luego los modificare) y a continuación los meto en un salida.txt

Como primera meta me he planteado el siguiente programa donde uso el fwrite para escribir lo que leo con el getline...

El problema que me da errores y no me compila, que me está fallando?

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>

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.

   // Pijada para ver si me lo está abriendo o no
   printf( "Fichero: %s -> ", nombre );
if( fichero )
printf( "creado (ABIERTO)\n" );
else
{
printf( "Error (NO ABIERTO)\n" );
return 1;
}
// Final pijada

cin.getline (*fichero, 256 , '\n'); //Con esto leo del datos.txt, hasta que se encuentra un salto de linea
    fwrite( fichero, sizeof(unsigned int), 10, fichero2 );

   printf( "\nLeyendo los datos del fichero \"%s\":\n", nombre );
   if( !fclose(fichero) )
      printf( "\nFichero cerrado\n" );
   else
   {
      printf( "\nError: fichero NO CERRADO\n" );
      return 1;
   }
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!