Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: EMP_47 en 01 de Noviembre 2015, 17:38
-
Hola. En un trabajo anterior tuve que hacer en Pascal Mostrar.pas y Crear.pas para archivos .dat. Me adjuntaron el EXAMEN2.dat para mostrarlo y después crear un archivo similar.
El .dat tiene la siguiente estructura:
THeader = record
Serial: Word; //2 bytes
Filename: String[255]; //1 byte
Date: Word; //2 bytes
Fieldnrs: Word; //2 bytes
NrsRecords: Word; //2 bytes
end;
TFields = record
Fieldnr: Word; //2 bytes
Fieldname: ShortString; //1 byte
end;
TRecordField = record
Fieldnr: Word; //2 bytes
FieldText: String[255]; //1 byte
end;
TDateTime = double;
Tengo que pasarlo a Java y hasta ahora solo logré esto:
package examen2;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class mostrar {
public static void main(String[] args) {
FileInputStream fis = null;
DataInputStream entrada = null;
int n;
try {
fis = new FileInputStream("C:/Dev-Pas/EXAMEN2.dat");
StringBuilder builder = new StringBuilder();
int ch;
while((ch = fis.read()) != -1){
builder.append((char)ch);
}
System.out.println(builder.toString());
entrada = new DataInputStream(fis);
while (true) {
n = entrada.readInt();
System.out.println(n);
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (EOFException e) {
System.out.println("Fin de fichero");
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (fis != null) {
fis.close();
}
if (entrada != null) {
entrada.close();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
Compila, pero no de la forma deseada.
Adjunto:
crear.pas
mostrar.pas
archivo.dat a mostrarprimero
la clase de java
consigna
imagen de ejemplo como debe mostrarse
muchas gracias.
-
Hola!
He visto tu consulta pero no he acabado de entender bien cuál es el objetivo. He visto los archivos adjuntos pero veo una consigna demasiado larga. Para obtener respuesta tienes que definir bien cuál es el problema y plantear las cuestiones de una en una, no dar una consigna extensa.
Recomendable leer https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0 ahí se indica esto:
Recomendaciones generales para consultas: no hagas consultas sobre problemas muy extensos o fragmentos de código muy extensos. Antes de hacer una consulta, intenta resolver tú mismo el problema. Cuando no sepas cómo avanzar, prepara el código necesario y pégalo, indicando dónde obtienes un error o no sabes avanzar. Describe cuáles son los objetivos que persigues de una forma clara y breve. Ten en cuenta que las personas que participan respondiendo voluntariamente en los foros en general responden cuestiones concretas y bien definidas, pero no resuelven ejercicios completos ni analizan consignas, enunciados o código de gran extensión porque sería demasiado costoso.
Saludos!
-
Gracias por la respuesta.
Resumiéndolo mucho la cuestión es que no muestra los datos listados correctamente. los muestra todos en una sola oración como si lo estuviera viendo desde un editor hexadecimal.
Cómo hago para leer cada registro por separado? aparte donde se almacena la fecha tengo que aplicar la funcion para calcular la fecha de verdad.
-
Eso tiene que ver con el toString() creo
System.out.println(builder.toString());
que muestra de golpe en una oracion todo el contenido del texto porque no has sobreescrito el metodo.
Creo que por eso lo ves todo en una oración, el resto no le veo problema yo.
Otra solución podria ser un while o un for que lea cada linea y la imprimas con el toString() por separado, linea a linea mientras.
-
Lo hice de esta manera, tengo mis dudas con los arrays...
package examen4;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class crear {
private static Scanner teclado;
public static void main(String[] args) {
teclado tc = new Scanner(System.in);
FileOutputStream fos = null;
DataOutputStream salida = null;
int n;
short s; //serial (2bytes)
char f; //filename (2bytes)
byte t; //# campos custom (1byte)
byte c;
byte i; //contador FOR
char x; //nombre de dato nro
int d; // fecha actual sistema
byte r; //cantidad de registros
int v[]; //VECTOR numero
char b[]; //vector letras
int Camp; //contador de campos completados
int k;
try {
fos = new FileOutputStream("C:/Dev-Pas/EXAMEN444.dat");
salida = new DataOutputStream(fos);
System.out.print("Introduce número Serie:"); //serial
s = tc.nextShort();
System.out.print("Ingrese Nombre Archivo:"); //path
f = tc.nextChar();
//CALCULAR FECHA ACA //fecha
salida.writeInt(d);
System.out.print("Ingrese Cantidad de Campos Customizados:"); //campos custom
t = tc.nextByte();
v = new int[t+1]; //aca esta el vector 0,1,2,3,...,t+1
b = new char[t+1];
for(i=1; i<t+1; i++) //codigo 1,2,3,4
{
v[t]=i; // Campo[tal].suNumero
salida.writeByte(t);
System.out.print("Ingrese Nombre de dato numero"+t); //nombre,tel,dir,email
tc.nextChar(); // escribir el vector[i] nombrecampo
salida.writeChar(b[i]);
}
System.out.print("Ingrese la cantidad de registros:"); //cantidad de registros
r = tc.nextByte();
salida.writeByte(r);
System.out.print("Ingrese los"+r+"contactos"); //datos contactos concretos
for(i=1; i<=r; i++) //desde el primer contacto hasta el ultimo
{
for (k=1; k<=t; k++) //desde el primer campo customizado hasta el ultimo
{
System.out.print("Ingrese"+b[k]);
tc.nextChar(b[k]);
if b.length <>0
{
Camp=(Camp+1);
}
}
}
salida.writeInt(Camp);
for (c=1; c<=t; c++) //cant campos custpm
{
v[c]=c;
if Length(b[c]) <> 0
{
salida.write(v[c]);
salida.write(b[c]);
}
}
Camp=0; //FIN
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (fos != null) {
fos.close();
}
if (salida != null) {
salida.close();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
-
Bueno si te funciona lo que pretendías hacer, ya esta bien. Hace lo que querías, al final era por el toString ? si pegas codigo comenta las dudas que tengas para buscar posibles fallos.
Saludo.
-
Es que falla. Pido ayuda con los arrays.
package examen4;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class crear {
private static Scanner teclado;
public static void main(String[] args) {
teclado tc = new Scanner(System.in);
FileOutputStream fos = null;
DataOutputStream salida = null;
int n;
short s; //serial (2bytes)
char f; //filename (2bytes)
byte t; //# campos custom (1byte)
byte c;
byte i; //contador FOR
char x; //nombre de dato nro
int d; // fecha actual sistema
byte r; //cantidad de registros
int v[]; //VECTOR numero
char b[]; //vector letras
int Camp; //contador de campos completados
int k;
try {
fos = new FileOutputStream("C:/Dev-Pas/EXAMEN444.dat");
salida = new DataOutputStream(fos);
System.out.print("Introduce número Serie:"); //serial
s = tc.nextShort();
System.out.print("Ingrese Nombre Archivo:"); //path
f = tc.nextChar();
//CALCULAR FECHA ACA //fecha
salida.writeInt(d);
System.out.print("Ingrese Cantidad de Campos Customizados:"); //campos custom
t = tc.nextByte();
v = new int[t+1]; //aca esta el vector 0,1,2,3,...,t+1
b = new char[t+1];
for(i=1; i<t+1; i++) //codigo 1,2,3,4
{
v[t]=i; // Campo[tal].suNumero
salida.writeByte(t);
System.out.print("Ingrese Nombre de dato numero"+t); //nombre,tel,dir,email
tc.nextChar(); // escribir el vector[i] nombrecampo
salida.writeChar(b[i]);
}
System.out.print("Ingrese la cantidad de registros:"); //cantidad de registros
r = tc.nextByte();
salida.writeByte(r);
System.out.print("Ingrese los"+r+"contactos"); //datos contactos concretos
for(i=1; i<=r; i++) //desde el primer contacto hasta el ultimo
{
for (k=1; k<=t; k++) //desde el primer campo customizado hasta el ultimo
{
System.out.print("Ingrese"+b[k]);
tc.nextChar(b[k]);
if b.length <>0
{
Camp=(Camp+1);
}
}
}
salida.writeInt(Camp);
for (c=1; c<=t; c++) //cant campos custpm
{
v[c]=c;
if Length(b[c]) <> 0
{
salida.write(v[c]);
salida.write(b[c]);
}
}
Camp=0; //FIN
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (fos != null) {
fos.close();
}
if (salida != null) {
salida.close();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
uso eclipse mars ver4.5.1
-
Buenas, no soy muy capaz asi con ese trozo de código de entender bien lo que hace ( otros seguro que si pueden).
Pero yo comentarte que donde defines los array con t+1, normalmente los arrays empiezan en 0, asi que si le sumas uno a la cantidad recibida, te puede dar excepcion de nullpointerException.
No se si esto te sirve de algo.
-
Porque trato de que quede, por ej:
1.Nombre
2.Telefono
3.Direccion
4.Email
en vez de:
0.Nombre
1.Telefono, etc.
tengo entendido que los arrays inician de 0. lo que quiero saber es como escribirle el dato al array.
pido primero crear un vector que va a contener codigos (1,2,3,4) y su respectivo nombre de dato (nombre, tel, dir, email). en Pascal seria asi:
Rec[C].Fieldnr //vector codigo de dato (1,2,3,4)
Rec[C].Fieldname//vector nombre de dato (nomb,tel,dir,etc).
despues haria otro vector distinto que tendria el numero del dato y el texto:
Rec[C].Fieldnr
Rec[C].FieldText
-
Bueno lo que yo haria, si lo que quieres es usar un array para guardar la información que pides.
Si son por ejemplo, 4 parametros, Nombre, Apellidos, Edad y Sueldo (por ejemplo)
String [] arrayEmpleado = new String [4];
private Scanner teclado;
for (int i = 0; i < 4; i++){
teclado = new Scanner(System.in);
arrayEmpleado[i] = teclado.nextLine();
}
Después una vez recogida la información como String ya la transformarás al dato que quieras. Int etc..
No se si te sirve la idea.
-
gracias por la respuesta. le cambie unas cosas pero me sigue tirando errores en las sig. lineas:
teclado tc = new Scanner(System.in);
if arrayNameDato.length<>0 //trato de calcular el largo del string en el array
salida.writeInt(arrayNumDato[c]);
salida.writeInt(arrayNameDato[c]);
salida.writeString(arrayNameDato);
package examen4;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class crear {
private static Scanner teclado;
public static void main(String[] args) {
teclado tc = new Scanner(System.in);
FileOutputStream fos = null;
DataOutputStream salida = null;
int n;
short s; //serial (2bytes)
char f; //filename (2bytes)
byte t; //# campos custom (1byte)
byte c;
byte i; //contador FOR
char x; //nombre de dato nro
int d; // fecha actual sistema
byte r; //cantidad de registros
int v[]; //VECTOR numero
char b[]; //vector letras
int Camp; //contador de campos completados
int k;
try {
fos = new FileOutputStream("C:/Dev-Pas/EXAMEN444.dat");
salida = new DataOutputStream(fos);
System.out.print("Introduce número Serie:"); //serial
s = tc.nextShort();
System.out.print("Ingrese Nombre Archivo:"); //path
f = tc.nextChar();
//CALCULAR FECHA ACA //fecha
salida.writeInt(d);
System.out.print("Ingrese Cantidad de Campos Customizados:"); //campos custom
t = tc.nextByte();
Byte [] arrayNumDato = new Byte [t];
String [] arrayNameDato = new String [t];
for(i=1; i<t+1; i++) //codigo 1,2,3,4
{
arrayNumDato[i]=i; // Campo[tal].suNumero
salida.writeByte(i);
System.out.print("Ingrese Nombre de dato numero"+t); //nombre,tel,dir,email
arrayNameDato[i] = tc.nextLine();
tc.nextString(); // escribir el vector[i] nombrecampo
salida.writeString(arrayNameDato[i]);
}
System.out.print("Ingrese la cantidad de registros:"); //cantidad de registros
r = tc.nextByte();
salida.writeByte(r);
System.out.print("Ingrese los"+r+"contactos"); //datos contactos concretos
for(i=1; i<=r; i++) //desde el primer contacto hasta el ultimo
{
for (k=1; k<=t; k++) //desde el primer campo customizado hasta el ultimo
{
System.out.print("Ingrese"+arrayNameDato[k]);
tc.nextString(arrayNameDato[k]);
if arrayNameDato.length<>0
{
Camp=(Camp+1);
}
}
}
salida.writeInt(Camp);
for (c=1; c<t+1; c++) //cant campos custpm
{
arrayNumDato[c]=c;
if arrayNameDato.length<>0 //largo del dato distinto de cero
{
salida.writeInt(arrayNumDato[c]);
salida.writeInt(arrayNameDato[c]);
}
}
Camp=0; //FIN
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (fos != null) {
fos.close();
}
if (salida != null) {
salida.close();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
-
Buenas
La de teclado tc = new Scanner... tienes que quitar el tc, tu has declarado Scanner teclado, el nombre es teclado. El resto mañana lo miro.
-
Muchas gracias. mi principal problema con el Crear es hacer dos vectores asi:
Vector1. Código del campo/Descripción del campo
Vector2. Cantidad de campos completos/Código del campo/Contenido del campo
tambien hacer un IF largo del contenido del vector es distinto de 0:
if arrayNameDato.length<>0
-
Explica que quieres hacer mas exactamente o pon el trozo de codigo que tengas ya hecho para que te ayudemos.
-
Buenas,
cuando le pides que te introduzcan los campos Customizados, no se porque recoges un Byte, cuando lo logico es recoger un Int, 1 campo 2 campos 3 campos....
t = tc.nextByte();
Byte [] arrayNumDato = new Byte [t];
String [] arrayNameDato = new String [t];
Y luego al crear el array de String con un nextByte pues yo creo que te descuadra todo.
Si los campos son numeros enteros, prueba con nextInt(); y guardalo en un int.
Así sabrás el numero de campos que debe tener el array y los solicitas todos con un bucle hasta ese int.
Deberías hacer el curso java de esta web, es realmente estupendo y no caerías en dudas elementales que te retrasan muchisimo.
Un saludo.
-
"t" es el numero de campos customizados, por eso los dos arrays se repiten "t" veces.
-
No hablo de eso. me Refiero a la declaración de t. es un Byte t cuando deberia ser un Int t.
Al menos si vas a crear un array de t elementos, la t debe ser un entero.