|
Mostrar Mensajes
|
Páginas: [1]
|
1
|
Programación / Programación C/C++ / Re: Como extraer datos de un txt y guardar en funcion de un valor en un binario??
|
en: 28 Enero 2016, 11:22 am
|
Cierto, perdon jeje Con este código ahora mismo lo que hace es leer pero nunca para, no se porque, pero se pone a escribir en binario y el archivo va creciendo pero sin sentido, solo deberia de escribir dos entradas y no para... #include "Header.h" void main() { lista persona; fstream archivo, archivodat; archivo.open("solicitudes.txt", ios::in); archivodat.open("agenda.dat", ios::out | ios::binary); if (!archivo) { cout << "Error al leer archivo"; } else { if (!archivodat) cout << "Error creando el archivo binario"; else { archivo.getline(persona.nombre, MAX, '#'); archivo >> persona.renta, ' '; if (persona.renta <= 6000) { //archivo >> persona.nota; while (!archivo.eof()) { //archivo.getline(persona.nombre, MAX, '#'); //archivo >> persona.renta, ' '; //archivo >> persona.nota; archivodat.write(persona.nombre, MAX); archivodat.write(reinterpret_cast<const char*>(&persona.renta), sizeof(int) + sizeof(float)); //archivodat.write(reinterpret_cast<const char *>(&persona), sizeof(lista)); } archivodat.close(); } } archivo.close(); } system("pause"); }
No se que tengo mal (que seguro son muchas cosas) Gracias por la ayuda saludos
|
|
|
2
|
Programación / Programación C/C++ / Re: Como extraer datos de un txt y guardar en funcion de un valor en un binario??
|
en: 28 Enero 2016, 09:28 am
|
Gracias por la ayuda! He introducido el código que me has dado y he comentado parte del que tenia, pero no consigo guardar en binario solo los que no superen X renta (en este caso he probado con 6000) #include "Header.h" void main() { lista persona; fstream archivo, archivodat; archivo.open("solicitudes.txt", ios::in); archivodat.open("agenda.dat", ios::out | ios::binary); if (!archivo) { cout << "Error al leer archivo"; } else { if (!archivodat) cout << "Error creando el archivo binario"; else { archivo.getline(persona.nombre, MAX, '#'); archivo >> persona.renta, ' '; if (persona.renta <= '6000') { //archivo >> persona.nota; while (!archivo.eof()) { //archivo.getline(persona.nombre, MAX, '#'); //archivo >> persona.renta, ' '; //archivo >> persona.nota; archivodat.write(persona.nombre, MAX); archivodat.write(reinterpret_cast<const char*>(&persona.renta), sizeof(int) + sizeof(float)); //archivodat.write(reinterpret_cast<const char *>(&persona), sizeof(lista)); } archivodat.close(); } } archivo.close(); } system("pause"); }
En mi txt tengo: Pepito Perez#5000 8.1 Pepa Gonzalez#6000 5.1 Kike Alvarez#7000 9.3 Entonces debería de guardar solo los dos primeros, pero no consigo que funcione, compila pero no hace su función... ¿Como puedo hacerlo? Muchas gracias!
|
|
|
3
|
Programación / Programación C/C++ / Como extraer datos de un txt y guardar en funcion de un valor en un binario??
|
en: 27 Enero 2016, 15:47 pm
|
Muy buenas amigos, para un ejercicio me piden que lea un txt que tenga la siguiente estructura: nombre # renta nota a partir de este txt, tengo que filtrar por los que tengan una renta menor que x (por ejemplo 10.000) y solo esos guardarlos en un archivo binario. De momento lo que tengo hecho es lo que veis abajo, lo unico que he conseguido es que si pongo un "cout" pinto todas las lineas del txt, pero no consigo filtrar por el segundo valor y meter todo lo que cuadre en un archivo binario... En el código que tengo quería probar a sacar el único nombre que tenia con el valor 6.000 pero no lo hace... me podeis ayudar? gracias!! archivo .h: // main.h #pragma once #include <iostream> #include <fstream> #include <string> using namespace std; #define MAX 50 typedef struct { char nombre[MAX]; int renta; float nota; }lista; int getLength(lista[]);
archivo cpp #include "Header.h" void main() { lista persona; fstream archivo, archivodat; archivo.open("solicitudes.txt", ios::in); archivodat.open("aceptados.dat", ios::out | ios::binary); if (!archivo) { cout << "Error al leer archivo"; } else { if (!archivodat) cout << "Error creando el archivo binario"; else { archivo.getline(persona.nombre, MAX, '#'); archivo >> persona.renta, ' '; if (persona.renta == '6000') { archivo >> persona.nota; while (!archivo.eof()) { archivo.getline(persona.nombre, MAX, '#'); archivo >> persona.renta, ' '; archivo >> persona.nota; archivodat.write(reinterpret_cast<const char *>(&persona), sizeof(lista)); } archivodat.close(); } } archivo.close(); } system("pause"); }
|
|
|
4
|
Programación / Programación C/C++ / Re: Ayuda con una ordenacion de un array please? :P
|
en: 13 Diciembre 2015, 20:01 pm
|
Muy buenas.
Si a lo que te refieres a no cambiar el archivo, pues sin guardarlo en dicho archivo seguirá desordenado. Si te refieres a seguir teniendo el array original desordenado puedes hacerle una copia y trabajar sobre la copia.
Bueno, lo voy a dejar así al final jeje Gracias por la ayuda Mafus! Saluds
|
|
|
5
|
Programación / Programación C/C++ / Re: Ayuda con una ordenacion de un array please? :P
|
en: 13 Diciembre 2015, 02:30 am
|
Muy buenas. Ahora que lo he visto, fallo mio. Siendo productoArray tu array de productos declarado como producto productoArray[pLength];
siendo pLength una constante numérica que marca el tamaño de tu array, la llamada a qsort debe ser así: qsort(productoArray , pLength , sizeof(producto ), comparar_producto );
No se si la funcion ordenarProducto debes incluirla obligatoriamente pero no te haría falta porque qsort hace todo el trabajo. Allí donde tengas ordenarProducto pones directamente qsort y tu array se debe ordenar directamente. Ha funciona a la perfección Mafus!! Muchas gracias! Una duda que me queda, en vez de modificar el txt original... ¿Se podría hacer un "cout" de un array temporal ordenado? Para dejar el archivo original intacto. Gracias por la solución! Un saludo!
|
|
|
6
|
Programación / Programación C/C++ / Re: Ayuda con una ordenacion de un array please? :P
|
en: 13 Diciembre 2015, 01:36 am
|
Muy buenas: Por lo pronto se me ocurre lo siguiente: Hacer una función que compare dos productos. int comparar_producto(const void *p1, const void *p2) { articulo *art1 = (articulo*) p1; articulo *art2 = (articulo*) p2; return strcmp(art1 ->nombre , art2 ->nombre ); }
Y finalmente usas la función qsort, de stdlib, para que te ordene ella sola el array. qsort(productoArray [], pLength , sizeof(producto ), comparar_producto );
Gracias Mafus por la idea! tengo un problemilla, y es que no se como pasar mi array como parametro a esa funcion que me has dicho jeje. en el productos.h tengo la llamada a la funcion: #include <stdlib.h> void ordenarProductos(producto productoArray[], int pLength);
y en el productos.cpp tengo la definición en dos partes, primero: int comparar_producto(const void *p1, const void *p2) { articulo *art1 = (articulo*)p1; articulo *art2 = (articulo*)p2; return strcmp(art1->nombre, art2->nombre); }
y despues: void ordenarProductos(producto productoArray[], int pLength) { qsort(productoArray[], pLength, sizeof(producto), comparar_producto); }
Estoy empezando con C++ y está claro que algo estoy haciendo mal jeje. A ver si me podéis ayudar! Gracias! Un saludo
|
|
|
7
|
Programación / Programación C/C++ / Ayuda con una ordenacion de un array please? :P
|
en: 12 Diciembre 2015, 19:30 pm
|
Buenas amigos! Para clase tengo que ordenar un array alfabeticamente, es un array que se forma a partir de la lectura de un fichero, tiene 4 columnas, la primera es el nombre que es por la que quiero ordenarlo... el caso es que he llegado a esto: void sortByName(producto productoArray[], int pLength) { char *temp; int i, j; for (i = 0; i<pLength - 1; i++) { for (j = i + 1; j<pLength; j++) { if (strcmp(productoArray[i].nombre, productoArray[j].nombre) > 0) { temp = productoArray[i].nombre; productoArray[i] = productoArray[j]; *productoArray[j].nombre = *temp; } } } for (int i = 0; i<pLength; i++) cout << i << ". Nombre: " << productoArray[i].nombre << ", Codigo de barras: " << productoArray[i].codigobarras << ", Precio: " << productoArray[i].precio << ". Fecha de entrada: " << productoArray[i].fechaentrada.dia << "/" << productoArray[i].fechaentrada.mes << "/" << productoArray[i].fechaentrada.anyo << endl; } Peeeeeero, esto me cambia el nombre de todos los productos por el nombre del que seria el primero ordenado, es decir, si fuera el alfabeto, el array quedaria con todos A A A A A A A A menos el último, que deja la Z. A esta funcion la llamo asi: void sortByName(producto productoArray[], int pLength); ¿Podéis ayudarme? Mil gracias!
|
|
|
8
|
Programación / Programación Visual Basic / Re: Ayuda para comparar dos archivos txt y extraer el contenido de uno de ellos??
|
en: 14 Julio 2015, 18:06 pm
|
Supongo que solo te falta añadir una linea para conseguir el valor que buscas. Algo así en esta zona: Do While fich2.atEndOfStream <> True linea2=fich2.ReadLine ' Ahora mostramos la línea leída wscript.echo linea2 ' Parseamos los campos campos = split(linea2,"#") for each b in campos wscript.echo "valor del campo: "&b next if campos(0)=linea then valorbuscado=campos(1): exit do Loop wscript.echo linea wscript.echo linea2 wscript.echo valorbuscado
Saludos Gracias pkj, te refieres a esta no? if campos(0)=linea then valorbuscado=campos(1): exit do
para cambiar la función del primer script, y ajustarlo con lo del segundo seria algo así? Function UserExit(sType, sWhen, sDetail, bSkip) oLogging.CreateEntry "entered UserExit ", LogTypeInfo UserExit = Success End Function
Function GetOfflineComputername() On Error Goto 0
If oEnvironment.Item("OSVERSION")="WinPE" Then Dim CompName : CompName = "" Dim oshell Dim fich, fs, fich2, ncx, linea 'ubicación de ficheros nombre_fich="c:\fichero1.txt" nombre_fich2="c:\fichero2.txt"
set oshell=createobject("WScript.shell") set fs=createobject("scripting.FileSystemObject")
'comprobamos que existan los ficheros if not fs.FileExists(nombre_fich) then wscript.echo "no existe el fichero "& nombre_fich WScript.Quit 4 end if
if not fs.FileExists(nombre_fich2) then wscript.echo "no existe el fichero "& nombre_fich2 WScript.Quit 4 end if
'Si hemos llegado hasta aquí es que existe y lo abrimos set fich=fs.OpenTextFile (nombre_fich, 1, "True" )
' Almacenamos en la variable linea el contenido de fichero1 Do While fich.atEndOfStream <> True linea=fich.ReadLine Loop
set fich2=fs.OpenTextFile (nombre_fich2, 1, "True" )
Do While fich2.atEndOfStream <> True linea2=fich2.ReadLine
' Parseamos los campos campos = split(linea2,"#") for each b in campos next if campos(0)=linea then valorbuscado=campos(1): exit do Loop
fich.close
CompName = valorbuscado
GetOfflineComputername = CStr(CompName) End Function
He quitado los echo porque no me interesa para el script, pero si para comprobar que funciona fuera jeje. Muchas gracias por la ayuda!
|
|
|
9
|
Programación / Programación Visual Basic / Ayuda para comparar dos archivos txt y extraer el contenido de uno de ellos??
|
en: 14 Julio 2015, 16:41 pm
|
Hola amigos!!! tengo un problemilla... tenia este script en vbs que me servia para extraer el hostname de un equipo y meterlo como una variable en WinPE Function UserExit(sType, sWhen, sDetail, bSkip) oLogging.CreateEntry "entered UserExit ", LogTypeInfo UserExit = Success End Function
Function GetOfflineComputername() On Error Goto 0
If oEnvironment.Item("OSVERSION")="WinPE" Then Dim CompName : CompName = "" Dim ret, sOldSystem : sOldSystem = "" For Each drv In Array("C", "D", "E", "F") If ofso.FileExists(drv & ":\windows\system32\config\system") Then sOldSystem = drv & ":\windows\system32\config\system" Exit For End If Next oLogging.CreateEntry "Mounting Offline registry " & sOldSystem, LogTypeInfo ret = oShell.Run ("reg load HKLM\z " & sOldSystem, 0, True) If ret = 0 Then CompName = oShell.RegRead("HKLM\z\ControlSet001\Services\Tcpip\Parameters\Hostname") If CompName <> "" Then oLogging.CreateEntry "Found old computername '" & CompName & "'", LogTypeInfo Else oLogging.CreateEntry "Old computername name could not be found", LogTypeWarning End If Else oLogging.CreateEntry "Could not mount offline registry " & sOldSystem, LogTypeWarning End If oShell.Run "REG UNLOAD HKLM\Z", 0, True Else CompName = oShell.ExpandEnvironmentStrings("%Computername%") End If
GetOfflineComputername = CStr(CompName) End Function
Este me funciona perfectamente, peeeeero ahora necesito hacer lo siguiente... Tengo un numero o nombre en un txt, solo ese número (ejemplo: AAAA0001) En otro archivo txt tengo el siguiente esquema: AAAA0001#BBBB0001#CCCC0001#DDDD0001 EEEE0001#FFFF0001#GGGG0001#HHHH0001 Así muchas lineas... tengo que comprobar en que linea esta el contenido del primer TXT y después quedarme SOLO con el segundo valor (BBBB0001) y guardarlo en una variable (o meterlo en el script de arriba de alguna manera fijo).... Hasta ahora lo que he conseguido es esto: dim oshell dim fich, fs, fich2, ncx, linea
'ubicación de ficheros nombre_fich="c:\fichero1.txt" nombre_fich2="c:\fichero2.txt"
set oshell=createobject("WScript.shell") set fs=createobject("scripting.FileSystemObject")
'comprobamos que existan los ficheros if not fs.FileExists(nombre_fich) then wscript.echo "no existe el fichero "& nombre_fich WScript.Quit 4 end if
if not fs.FileExists(nombre_fich2) then wscript.echo "no existe el fichero "& nombre_fich2 WScript.Quit 4 end if
'Si hemos llegado hasta aquí es que existe y lo abrimos set fich=fs.OpenTextFile (nombre_fich, 1, "True" )
' Almacenamos en la variable linea el contenido de fichero1 Do While fich.atEndOfStream <> True linea=fich.ReadLine ' Ahora mostramos la línea leída wscript.echo linea Loop
set fich2=fs.OpenTextFile (nombre_fich2, 1, "True" )
Do While fich2.atEndOfStream <> True linea2=fich2.ReadLine ' Ahora mostramos la línea leída wscript.echo linea2 ' Parseamos los campos campos = split(linea2,"#") for each b in campos wscript.echo "valor del campo: "&b next Loop
wscript.echo linea wscript.echo linea2
fich.close
Vale, consigo imprimir la linea del fichero1 y ademas imprimir todo el fichero2, pero me he quedado estancado jeje. Me ayudáis?? Muchas gracias!! Un saludo
|
|
|
|
|
|
|