Error al usar funciones
Hola, este es mi primer mensaje aquí y lo dejo porque tengo un problema con el manejo de ficheros y espero que alguien me pueda echar una mano.
Resulta que tengo instalada la version 4.9.8 del Dev. Ahora mismo estoy repasando el tema de ficheros, y cada vez que utilizo descriptor.read(&c,num) o descriptor.write(&c,num) me aparece un error tal que asi:
"no matching function for call to` " en la lineas en las que utilizo las susodichas funciones. Supongo que quiere decir que no existen read ni write como funciones.
Bueno, no sé porqué me sale esto. He repasado el codigo y no he visto nada raro, ni he obviado el <fstream>, ni nada. Es más, compilando ejercicios de clase, supuestamente perfectos, me sale lo mismo.
¿Es posible que tenga que configurar las opciones del entorno del compilador o algo así para que acepte estas funciones?
Gracias por adelantado. Un saludo.
Resulta que tengo instalada la version 4.9.8 del Dev. Ahora mismo estoy repasando el tema de ficheros, y cada vez que utilizo descriptor.read(&c,num) o descriptor.write(&c,num) me aparece un error tal que asi:
"no matching function for call to` " en la lineas en las que utilizo las susodichas funciones. Supongo que quiere decir que no existen read ni write como funciones.
Bueno, no sé porqué me sale esto. He repasado el codigo y no he visto nada raro, ni he obviado el <fstream>, ni nada. Es más, compilando ejercicios de clase, supuestamente perfectos, me sale lo mismo.
¿Es posible que tenga que configurar las opciones del entorno del compilador o algo así para que acepte estas funciones?
Gracias por adelantado. Un saludo.
Mira,sería bueno que pusieras el código exacto
que te da errores,en cuanto al compilador,
no hay nada que configurar.
que te da errores,en cuanto al compilador,
no hay nada que configurar.
Vale, aquí está el código de uno de los programas que vienen como ejemplo en mis apuntes, el cual me da los mismos errores.
--------------------------------------------------------------------------
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
int i,N;
fstream fichbin("ejemplo11.dat",ios::binary | ios::in | ios::out);
for (i=1;i<=10;i++)
{
fichbin.write(&i,sizeof(int));
}
fichbin.seekp(4*sizeof(int));
fichbin.read(&N,sizeof(int));
cout << endl << "Quinto: " << N << endl;
fichbin.seekp(4*sizeof(int));
i=100;
fichbin.read(&i,sizeof(int));
fichbin.seekp(0);
for (i=1;i<=10;i++)
{
fichbin.read(&N,sizeof(int));
cout << endl << i << "= " << N << endl;
}
fichbin.close();
system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
--------------------------------------------------------------------
Un saludo.
--------------------------------------------------------------------------
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
int i,N;
fstream fichbin("ejemplo11.dat",ios::binary | ios::in | ios::out);
for (i=1;i<=10;i++)
{
fichbin.write(&i,sizeof(int));
}
fichbin.seekp(4*sizeof(int));
fichbin.read(&N,sizeof(int));
cout << endl << "Quinto: " << N << endl;
fichbin.seekp(4*sizeof(int));
i=100;
fichbin.read(&i,sizeof(int));
fichbin.seekp(0);
for (i=1;i<=10;i++)
{
fichbin.read(&N,sizeof(int));
cout << endl << i << "= " << N << endl;
}
fichbin.close();
system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
--------------------------------------------------------------------
Un saludo.
Viendo mejor la cosa, así como está tampoco alcanza para que funcione. Lo escribo corregido, y con algún comentario:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int i,N;
fstream::pos_type pos; // para el puntero de archivo.
fstream fichbin("ejemplo11.dat",
ios::in|ios::out|ios::binary|ios::trunc); /
if(fichbin.fail() ) cout<< "error al abrir fichbin...";
for (i=1;i<=10;i++)
{
if(i==5) pos = fichbin.tellp(); // guarda la posición
fichbin << i << ' '; // un espacio entre cada entero
}
fichbin.seekp(pos); // vuelve a la pos guardada
fichbin >> N;
cout << endl << "Quinto: " << N << endl;
fichbin >> i;
fichbin.seekp(0); // va al inicio del archivo
for (i=1;i<=10;i++)
{
fichbin >> N;
cout << endl << i << "= " << N << endl;
}
fichbin.close();
system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
// Alejandro
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int i,N;
fstream::pos_type pos; // para el puntero de archivo.
fstream fichbin("ejemplo11.dat",
ios::in|ios::out|ios::binary|ios::trunc); /
if(fichbin.fail() ) cout<< "error al abrir fichbin...";
for (i=1;i<=10;i++)
{
if(i==5) pos = fichbin.tellp(); // guarda la posición
fichbin << i << ' '; // un espacio entre cada entero
}
fichbin.seekp(pos); // vuelve a la pos guardada
fichbin >> N;
cout << endl << "Quinto: " << N << endl;
fichbin >> i;
fichbin.seekp(0); // va al inicio del archivo
for (i=1;i<=10;i++)
{
fichbin >> N;
cout << endl << i << "= " << N << endl;
}
fichbin.close();
system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
// Alejandro
Si que se pueden usar las funciones read y write; el unico detalle es que solo admiten trabajar con bytes, de manera que para pasarle como parametro un entero hay que hacer la conversion de tipo para que lo interprete como ella sabe. Quedaria, por ejemplo, asi: fichbin.write((char*)&i,sizeof(int));
Como no hay ninguna funcion que acepte como parametro un puntero a entero, suelta el error. Por lo demas (salvo añadir ios::trunc) el ejemplo funciona tal como esta.
En el ejemplo de Alejandro la informacion se guarda en el archivo en formato ascii (el operador << le da formato de texto por defecto), mientras que en el de Sergio si que se guarda en formato binario (01000000020000000300000004000000....), que supongo que es lo que se pretende (lo digo por el fichbin, y por la extension del archivo)
Como no hay ninguna funcion que acepte como parametro un puntero a entero, suelta el error. Por lo demas (salvo añadir ios::trunc) el ejemplo funciona tal como esta.
En el ejemplo de Alejandro la informacion se guarda en el archivo en formato ascii (el operador << le da formato de texto por defecto), mientras que en el de Sergio si que se guarda en formato binario (01000000020000000300000004000000....), que supongo que es lo que se pretende (lo digo por el fichbin, y por la extension del archivo)
Efectivamente, write y read no son funciones de la clase template fstream; para lectura y escritura en el flujo abierto con fstream debes usar los operadores << (inserción) y >> (extracción).
Tu ejemplo quedaría:
#include <iostream>
//#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
int i,N;
fstream fichbin("ejemplo11.dat",ios::binary | ios::in | ios::out);
for (i=1;i<=10;i++)
{
//fichbin.write(&i,sizeof(int));
fichbin << i;
}
fichbin.seekp(4*sizeof(int));
//fichbin.read(&N,sizeof(int));
fichbin >> N;
cout << endl << "Quinto: " << N << endl;
fichbin.seekp(4*sizeof(int));
i=100;
//fichbin.read(&i,sizeof(int));
fichbin >> i;
fichbin.seekp(0);
for (i=1;i<=10;i++)
{
//fichbin.read(&N,sizeof(int));
fichbin << N;
cout << endl << i << "= " << N << endl;
}
fichbin.close();
system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
/*
nota que también comenté #include <cstdlib> que aquí no hace nada.
Alejandro
*/
Tu ejemplo quedaría:
#include <iostream>
//#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
int i,N;
fstream fichbin("ejemplo11.dat",ios::binary | ios::in | ios::out);
for (i=1;i<=10;i++)
{
//fichbin.write(&i,sizeof(int));
fichbin << i;
}
fichbin.seekp(4*sizeof(int));
//fichbin.read(&N,sizeof(int));
fichbin >> N;
cout << endl << "Quinto: " << N << endl;
fichbin.seekp(4*sizeof(int));
i=100;
//fichbin.read(&i,sizeof(int));
fichbin >> i;
fichbin.seekp(0);
for (i=1;i<=10;i++)
{
//fichbin.read(&N,sizeof(int));
fichbin << N;
cout << endl << i << "= " << N << endl;
}
fichbin.close();
system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
/*
nota que también comenté #include <cstdlib> que aquí no hace nada.
Alejandro
*/
