none
Como ordenar los numeros de un archivo.txt RRS feed

  • Pregunta

  • Que tal buenas tardes, en este momento presento un problema ya le avance un poco y quería ver si me pueden proporcionar su ayuda no que me realicen el código si no que me orienten el problema es el siguiente : 

    Tengo que crear 2 archivos.txt en c++ utilizando estructuras, entonces dentro de esos 2 archivos debo de ingresar números en el archivo 1 debo ingresar 7, y en el archivo 2 debo ingresar 5, entonces una vez ya creados debo emplear el algoritmo de intercalación el cual me debe generar un archivo 3 con los números ya ordenados

    #include "stdafx.h"
    #include <fstream>
    #include <iostream>
    using namespace std; 
    void crearArchivo();
    void muestraArchivo();
    struct F1{
    int clave;
    };


    void main()
    {
    crearArchivo();
    muestraArchivo();
    }
    void crearArchivo()
    {
    ofstream archivo("C:\gufy5\Desktop\Estructura de datos\F2.txt",ios::out);
    if(!archivo)
    {
    cout<<"No se creo el archivo.\n";
    system("PAUSE");
    }
    system("cls");
    F1 datos;
    int n=7;
    cout<<"Graba Claves de F1\n\n"<<endl;
    cin.ignore();

    for(int I=0;I<n; I++){
    cout<<"clave ";
    cin>>datos.clave;
    archivo.write(reinterpret_cast<const char*>(&datos),sizeof(struct F1));
    }
    cout<<"Archivo Guardado con exito!!\n\n";
    archivo.close();
    system("PAUSE");
    return;
    }
    void muestraArchivo()
    {
    F1 datos;
    int n=7;
    ifstream archivo("C:\gufy5\Desktop\Estructura de datos\F2.txt",ios::in|ios::binary);
    if(!archivo)
    {
    cout<<"No se pudo abrir el archivo.";
    system("PAUSE");
    exit(0);
    }
    while(!archivo.eof()){
    archivo.read(reinterpret_cast<char*>(&datos),sizeof(struct F1));
    cout<<datos.clave<<endl;
    }
    archivo.close();
    system("PAUSE");
    }

    esto es lo que llevo hasta el momento espero y me puedan ofrecer su ayuda, se los agradeceria mucho !! 

    jueves, 12 de mayo de 2016 1:37

Todas las respuestas

  • Hola.  Recuerdo su pregunta.  Creo que estaba en el foro de C#.  Lo siento, cuando el trabajo abunda tiendo a desatender el foro.  Supongo que primero lo que me da de comer. :-)

    Revisé su historial y aunque usted no sabía qué era STL (Standard Template Library), ciertamente lo utiliza.  Revisé la respuesta que me dio en su pregunta en el foro de C# y dice usted que ha estudiado como una decena de algoritmos de ordenamiento.  Le pregunto entonces:  ¿Debe usted implementar algún algoritmo en particular?  Le pregunto porque el STL tiene std::sort().  Si no le exigen implementar el algoritmo de ordenamiento, lo que yo haría sería usar lo que ya viene en el STL (#include <algorithm>).

    Volviendo a su problema original, debo preguntar:  ¿Cuál es la fuente de los 12 números a ordenar (7 en un archivo y 5 en otro)?  ¿Los archivos se generan primero y luego se ordenan y se escriben en un 3er archivo?  ¿Así es como debe funcionar?  Si es así, supongo que lo que me falta por saber es lo de la fuente de los 12 números.


    Jose R. MCP
    Code Samples

    jueves, 12 de mayo de 2016 2:57
    Moderador
  • Que tal Jose. Así es mi pregunta estaba en el foro equivocado, y no se preocupe agradezco que se tome el tiempo necesario para poder apoyarme en la pregunta que estoy realizando :) . 
    Primeramente que nada gracias por responder lo que es STL.
    Y así es el algoritmo que debo de implementar se llama "Intercalación" el algoritmo lo poseo si gusta se lo puedo mostrar o escribir, el problema que presento es que no se trabajar muy bien con los archivos reafirmando lo que me comento así es se deben crear 2 archivos de texto el cual el primero debe contener 7 números, y el otro 5 números luego empleando el algoritmo de ordenamiento "Intercalación" 

    f1: 10 16 25 28 66 82 87 f2: 06 09 18 20 35 Vamos a crear un archivo f3! f3: 06 09 10 16 18 20 25 28 35 66 82 87 Algoritmo INTERCALACION(F1,F2,F3) {El algoritmo intercala los elementos de 2 archvios ya ordenados F1 y F2 y almacena el resultado en el archivo F3} {R1 y R2 son variables de tipo entero. BAND es una variable de tipo booleano} 1. Abrir los archivos F1 y F2 para lectura. 2. Abrir el archivo F3 para escritura. 3. Leer R1 de F1 y R2 de F2 {R1 y R2 son las primeras claves de F1 y F2 , respectivamente} 4. Repetir mientras (no sea el fin de archivo de F1)y (no sea el fin del archivo F2) 4.1 Si R1<R2 entonces Escribir de R1 en F3 Leer R1 de F1 si no Escribir R2 en F3 Leer R2 de F2 4.2 (Fin del condicional del paso 4.1) 5. {Fin del ciclo del paso 4} 6. Hacer BAND = FALSO 7. Repetir mientras (no sea el el fin de archivo de F1)o(no sea el fin de archivo de F2) 7.1 Si(fin de archivo de F1) entonces 7.11 Si R1<R2 entonces Escribir R1 en F3 Escribir R2 en F3 7.1.1.1 Repetir mietnras (No sea el fin de archivo de F2) Leer R2 en F2 Escribir R2 en F3 7.1.1.2 {Fin del ciclo del paso 7.1.1.1} Hacer BAND=VERDADERO si no Escribir R2 en F3 Leer R2 de F2 7.1.2 {Fin del condicional del paso 7.1.1} si no 7.1.3 Si R1<R2 Entonces Escribir R1 en F3 Leer R1 de F1 si no Escribir R2 en F3 Escribir R1 en F3 7.1.3.1 Repetir mientras (No sea el fn de archivo de F1) Leer R1 de F1 Escribir R1 en F3 7.1.3.2 (Fin del ciclo del paso 7.1.3.1) Hacer BAND=VERDADERO 7.1.4 (Fin del condicional del paso 7.1.3) 7.2 (Fin del condicional del paso 7.1 ) 8. {Fin del ciclo del paso 7} 9. Si BAND = FALSO entonces 9.1 Si R1<R2 Entonces EScribir R2 en F3 Escribir R2 en F3

    Fin del condicional
    Fin del condicional
    Cerrar archivos F1, F2, F3


    Esto es el algoritmo que poseo, entonces empleando el algoritmo debo crear 2 archivos el problema aquí es que no se como crear el segundo archivo, y como es que se genera el archivo 3 ya con los números ordenados y ahí arriba le muestro el origen de los 12 números son los que van a ordenar 


    jueves, 12 de mayo de 2016 7:15
  • Ok, viera que sigo sin saber cuál es la fuente de los números.  ¿De dónde vienen los números que se almacenan en el archivo 1 y 2?  ¿Son digitados por el usuario?  A estas alturas voy a asumir eso.

    Este es un pequeño programa que lee números desde la consola hacia un archivo, luego lee los archivos en una colección tipo std::vector<int> y finalmente usa std::sort() para ordenar.  Le dejo de tarea programar su propia función de ordenamiento para que no use std::sort() y así satisfaga su requerimiento.  Si necesita explicación de alguna parte me avisa.

    #include "stdafx.h"
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    
    typedef std::basic_string<TCHAR> tstring;
    typedef std::basic_ostream<TCHAR> tostream;
    typedef std::basic_istream<TCHAR> tistream;
    typedef std::basic_filebuf<TCHAR> tfilebuf;
    
    #ifdef UNICODE
    #define tcin std::wcin
    #define tcout std::wcout
    #else
    #define tcin std::cin
    #define tcout std::cout
    #endif
    
    const tstring Archivo1 = _T("Archivo 01.txt");
    const tstring Archivo2 = _T("Archivo 02.txt");
    
    void ReadNumbersFromConsoleIntoFile(int totalNumbers, const tstring& fileName)
    {
    	int counter = 0;
    	int number;
    	tfilebuf fb;
    	fb.open(fileName, std::ios::out);
    	tostream output(&fb);
    	while (counter < totalNumbers)
    	{
    		volatile bool goodNumber = false;
    		do
    		{
    			tcin >> number;
    			if (!tcin.good())
    			{
    				tcin.clear();
    				tcin.ignore(1);
    			}
    			else
    			{
    				goodNumber = true;
    			}
    		} while (!goodNumber);
    		output << number << _T(" ");
    		++counter;
    	}
    	fb.close();
    }
    
    void AddNumbersInFileToCollection(std::vector<int>& coll, const tstring& fileName)
    {
    	tfilebuf fb;
    	if (fb.open(fileName, std::ios::in))
    	{
    		tistream input(&fb);
    		int number;
    		while (!input.eof())
    		{
    			input >> number;
    			if (input.good())
    			{
    				coll.push_back(number);
    			}
    			else
    			{
    				input.clear();
    				input.ignore(1);
    			}
    		}
    		fb.close();
    	}
    }
    
    void ShowNumbersOnScreen(const std::vector<int>& coll)
    {
    	
    	for (std::vector<int>::const_iterator it = coll.cbegin(); it != coll.cend(); ++it)
    	{
    		tcout << *it << _T(" ");
    	}
    	tcout << std::endl;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	tcout << "Digite 7 números enteros para el primer archivo:  " << std::endl;
    	ReadNumbersFromConsoleIntoFile(7, Archivo1);
    	tcout << "Digite 5 números enteros para el segundo archivo:  " << std::endl;
    	ReadNumbersFromConsoleIntoFile(5, Archivo2);
    	//Leer ambos archivos a una colección y ordenar.
    	std::vector<int> numeros;
    	AddNumbersInFileToCollection(numeros, Archivo1);
    	AddNumbersInFileToCollection(numeros, Archivo2);
    	ShowNumbersOnScreen(numeros);
    	std::sort(numeros.begin(), numeros.end());
    	ShowNumbersOnScreen(numeros);
    	return 0;
    }
    


    Jose R. MCP
    Code Samples

    jueves, 12 de mayo de 2016 14:27
    Moderador