Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Archivos binarios..

Preguntas y respuestas sobre el lenguaje de programacion C/C++

Archivos binarios..

Notapor Spiker el Sab Mar 03, 2007 1:58 pm

Primero que nada, me presento, soy Juan Pablo, estudiante de Bioinformática en la facultad de Ingenieria en Entre Ríos..
Tengo un problema, quiero saber si trabajando con un archivo de texto (*.txt) se lo puede utilizar como binario.
Para ser un poco más explícito, quisiera saber si en C++ la sentencia
fstream Archi("Numeros.txt", ios::in | ios::binary) sería posible de efectuar, ya que cuando compilo y arranca el programa parece no extraer los datos del archivo de origen..
Cualquier comentario al respecto me sería de mucha ayuda...!!

Desde ya, muchas gracias y salu2 a todos!
Spiker
Novato
Novato
 
Mensajes: 5
Registrado: Sab Mar 03, 2007 1:34 pm

Re: Archivos binarios..

Notapor latindeveloper el Vie Mar 16, 2007 12:20 pm

es posible que el archivo Numeros.txt no este en la misma carpeta del ejecutable, si ese no es el caso entonces por que no nos muetras el codigo que carga ese archivo y la manera en que obtienes datos.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Ahi va el codigo...

Notapor Spiker el Sab Mar 17, 2007 1:08 pm

El archivo se encuentra en la misma carpeta, asi q ese no es el problema.. Ahí va el código... (otro problema me surge al mostrar el valor del contador dentro del IF, posee un valor muy grande... se asemeja a lo q podría pasar si se trata de utilizar una variable q no se encuentre al alcance de la función en la que fue declarada..)

Código: Seleccionar todo
class Numeros
{
private:
       int numero;
       int contador;

public:
      void Primerprimo();
      bool Determinacion(int variable);


};

void Numeros::Primerprimo()
{
contador = 0;
fstream Archivo("Numero e.txt", ios::in | ios::binary);

Archivo.seekg(0, ios::end);
int t= Archivo.tellg()/sizeof(int);

cin.get();
for(int i = 0; i<t; i++)
{
  Archivo.read((char*)&numero, sizeof(numero));

  if(Determinacion(numero))
    {
     contador++;
     cout<<"contador4: "<<contador;
     cout << endl << "El primer primo de 10 dígitos consecutivos del desarrollo de e es el número: " << numero << endl << "Dígitos pertenecientes al lugar del entero formado número: " << contador << endl << endl;
    }

   else
   contador++;
   cout<<"else-contador: "<<contador;
  }
 
Archivo.close();
}


bool Numeros::Determinacion(int variable)
{
bool esprimo = false;

if(((variable%2)!=0) || ((variable%3)!=0) || ((variable%5)!=0) || ((variable%7)!=0))
  esprimo=true;


}


Espero que puedas ayudarme u orientarme...
Spiker
Novato
Novato
 
Mensajes: 5
Registrado: Sab Mar 03, 2007 1:34 pm

Re: Ahi va el codigo...

Notapor latindeveloper el Sab Mar 17, 2007 1:27 pm

Podrías tambien mostrarnos el archivo "Numero e.txt", para hacer un test y poder ayudate.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Notapor Spiker el Sab Mar 17, 2007 1:55 pm

Sí, el archivo contiene sólamente una secuencia como esta:
Así empieza:
7182818284590452353602874713526624977572470936999595749669676277240766303535 47594571382178525166427427466391932003059921817413596629043572900334295260595630 73813232862794349076323382988075319525101901157383418793070215408914993488416750 92447614606680822648001684774118537423454424371075390777449920695517027618386062 61331384583000752044933826560297606737113200709328709127443747047230696977209310 14169283681902551510865746377211125238978442505695369677078544996996794686445490 59879316368892300987931277361782154249992295763514822082698951936680331825288693 98496465105820939239829488793320362509443117301238197068416140397019837679320683 28237646480429531180232878250981945581530175671736133206981125099618188159304169 03515988885193458072738667385894228792284998920868058257492796104841984443634632 44968487560233624827041978623209002160990235304369941849146314093431738143640546 25315209618369088870701676839642437814059271456354906130310720851038375051011574 77041718986106873969655212671546889570350354021234078498193343210681701210056278 80235193033224745015853904730419957777093503660416997329725088687696640355570716 22684471625607988265178713419512466520103059212366771943252786753985589448969709 64097545918569563802363701621120477427228364896134225164450781824423529486363721 41740238893441247963574370263755294448337998016125492278509257782562092622648326 27793338656648162772516401910590049164499828931505660472580277863186415519565324 42586982946959308019152987211725563475463964479101459040905862984967912874068705 04895858671747985466775757320568128845920541334053922000113786300945560688166740 01698420558040336379537645203040243225661352783695117788386387443966253224985065 49958862342818997077332761717839280349465014345588970719425863987727547109629537 41521115136835062752602326484728703920764310059584116612054529703023647254929666 93811513732275364509888903136020572481765851180630364428123149655070475102544650 11727211555194866850800368532281831521960037356252794495158284188294787610852639 81395599006737648292244375287184624578036192981971399147564488262603903381441823 26251509748279877799643730899703888677822713836057729788241256119071766394650706 33045279546618550966661856647097113444740160704626215680717481877844371436988218 55967095910259686200235371858874856965220005031173439207321139080329363447972735 59552773490717837934216370120500545132638354400018632399149070547977805669785335 80489669062951194324730995876552368128590413832411607226029983305353708761389396 39177957454016137223618789365260538155841587186925538606164779834025435128439612 94603529133259427949043372990857315802909586313826832914771163963370924003168945 86360606458459251269946557248391865642097526850823075442545993769170419777800853 62730941710163434907696423722294352366125572508814779223151974778060569672538017 18077636034624592787784658506560507808442115296975218908740196609066518035165017 92504619501366585436632712549639908549144200014574760819302212066024330096412704 89439039717719518069908699860663658323227870937650226014929101151717763594460202 32493002804018677239102880978666056511832600436885088171572386698422422010249505 51881694803221002515426494639812873677658927688163598312477886520141174110913601 16499507662907794364600585194199856016264790761532103872755712699251827568798930 27617611461625493564959037980458381823233686120162437365698467037858533052758333 37939907521660692380533698879565137285593883499894707416181550125397064648171946 70834819721448889879067650379590366967249499254527903372963616265897603949857674 13973594410237443297093554779826296145914429364514286171585873397467918975712119 56187385783644758448423555581050025611492391518893099463428413936080383091662818 81150371528496705974162562823609216807515017772538740256425347087908913729172282 86115159156837252416307722544063378759310598267609442032619242853170187817729602 35413060672136046000389661093647095141417185777014180606443636815464440053316087 78314317444081194942297559931401188868331483280270655383300469329011574414756313 99972217038046170928945790962716622607407187499753592127560844147378233032703301 68237193648002173285734935947564334129943024850235732214597843282641421684878721 67336701061509424345698440187331281010794512722373788612605816566805371439612788 87325273738903928905068653241380627960259303877276977837928684093253658807339884 57218746021005311483351323850047827169376218004904795597959290591655470505777514 30817511269898518840871856402603530558373783242292418562564425502267215598027401 26179719280471396006891638286652770097527670697770364392602243728418408832518487 70472638440379530166905465937461619323840363893131364327137688841026811219891275 22305625675625470172508634976536728860596675274086862740791285657699631378975303 46606166698042182677245605306607738996242183408598820718646826232150802882863597 46839654358856685503773131296587975810501214916207656769950659715344763470320853 21560367482860837865680307306265763346977429563464371670939719306087696349532884 68336130388294310408002968738691170666661468000151211434422560238744743252507693 87077775193299942137277211258843608715834835626961661980572526612206797540621062 08064

Y así continúa... el archivo contiene unos miles de miles de números más, por cierto... pero el proceso es el mismo....
Spiker
Novato
Novato
 
Mensajes: 5
Registrado: Sab Mar 03, 2007 1:34 pm

Numeros grandes

Notapor latindeveloper el Sab Mar 17, 2007 2:17 pm

Ufff los numeros son muy grandes.

En c/c++ hay limites para los tipos de datos numericos: http://www.zator.com/Cpp/E2_2_4.htm

En la ACM ( http://acm.uva.es/problemset/ ) hay problemas que tienen que ver con numeros muy grandes, esos problemas se solucionan con la clase BigInteger

Ver:
http://www.comp.nus.edu.sg/~stevenha/pr ... gInteger.h

La idea de implementar una clase que acepte numeros muy muy grandes es facil, se trata de un array de cadenas que contiene caracteres numericos. Las operaciones de suma, resta, multiplilcacion, y un largo etc... se tienen que hacer manualmente, es decir, digito a digito. La clase CBigInteger ayuda mucho por que casi todo esta implementado.

Saludos.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Pero...

Notapor Spiker el Sab Mar 17, 2007 2:28 pm

Igualmente, lo que busco en principio no es el realizar operaciones aritmeticas con los números, sino agruparlos de a 10 dígitos, almacenarlos en una variable, comprobar si el número es primo y sacarlo por pantalla.. De no serlo, seguir con los diez digitos siguientes y asi sucesivamente.. Eso es lo q tengo en el código q subi.... (o lo q intente hacer, mejor dicho...) Es con esta cuestión con la que tengo problemas, como comenté anteriormente...

Me explico bien??
Spiker
Novato
Novato
 
Mensajes: 5
Registrado: Sab Mar 03, 2007 1:34 pm

Re: Pero...

Notapor latindeveloper el Sab Mar 17, 2007 2:42 pm

Entonces cambia de int a unsigned long para que puedas procesar numeros de 10 digitos, pero aun asi no podras operarlos por que el maximo numero que puedes utilizar en el tipo unsigned long es 4294967295, y si existe algun numero mayor que ese (por ejemplo 4294967296) provocará un overflow.
Ultima edición por latindeveloper el Sab Mar 17, 2007 2:46 pm, editado 1 vez en total
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Me olvide de los long long

Notapor latindeveloper el Sab Mar 17, 2007 2:45 pm

Me olvidaba que existen otros tipos de datos como:

long long y unsigned long long. con esos tipos de datos si podras procesar los numeros que necesitas.

Limites:
long : +-2,147,483,647
unsigned long: +4,294,967,295

long long : +-18,446,744,073,709,551,615
insigned long long: +18,446,744,073,709,551,615
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Mmm...

Notapor Spiker el Sab Mar 17, 2007 3:49 pm

Gracias por los datos que me haz mandado.. me servirán con el tema de los límites, pero no con el programa en sí..

Voy a tratar de ser más explícito..

He intentado además con un archivo q contenga lo siguiente:
45675

Nada más q eso...

Así use un long, para lo cual no habría problema alguno, y "considerando q este numero SEA primo", el programa NO me lo muestra por pantalla porq NUNCA lo carga en la variable, además, el contador NUNCA se incrementa, siempre tiene el mismo valor...

Esos son los problemas q no he podido solucionar...

El código es el q subi comentarios antes... ¿q estoy haciendo mal? o ¿q no he tenido en cuenta?

Salu2..
Spiker
Novato
Novato
 
Mensajes: 5
Registrado: Sab Mar 03, 2007 1:34 pm

Re: Mmm...

Notapor latindeveloper el Sab Mar 17, 2007 5:02 pm

En el segmento de tu programa

Código: Seleccionar todo
Archivo.seekg(0, ios::end);
int t= Archivo.tellg()/sizeof(int);

cin.get();
for(int i = 0; i<t; i++)


Calculas el tamaño del archivo para asi hacer el for.... pero antes de hacer eso tienes que regresar al inicio:


Código: Seleccionar todo
Archivo.seekg(0, ios::end);
int t= Archivo.tellg()/sizeof(int);

Archivo.seekg(0, ios::beg); // Ir  al inicio

cin.get();
for(int i = 0; i<t; i++)
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru


Volver a C/C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados