Manipulando Arquivos

2 respostas
U

Galera, a rotina abaixo Lê um arquivo com uma struct gravada em c++:

private void openReadFile () {
JFileChooser fileChooser = new JFileChooser ();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result  = fileChooser.showOpenDialog(this);

if (result == JFileChooser.CANCEL_OPTION){
	System.out.println("Clicado CANEL");
}

File fileName = fileChooser.getSelectedFile();		

if (fileName == null || fileName.getName().equals("")){
	System.out.println("Erro no nome do arquivo");
}
else {
	try {
		input = new ObjectInputStream (new FileInputStream(fileName));		
		cine = (EstructCine) input.readObject();
	} catch (Exception e) {				
		e.printStackTrace();
	} 
}

}

Porém, os valores lidos e salvos na struct “cine” não condizem com os valores da struct armazenados que são:

long numero
char nome [25]
int   codigo

Existe alguma melosquência entre C++ e Java quando C++ grava o arquivo e Java o lê???

Att.

Ulisses Nunes

2 Respostas

T

Claro, ObjectInputStream e ObjectOutputStream não são feitos para fazer “interoperabilidade” de C++ com Java, porque eles supõem que você tenha usado serialização de objetos Java, não C++.
No máximo você poderia tentar usar DataInputStream e DataOutputStream, mas tomando bastante cuidado. Por exemplo, readInt supõe que o inteiro 0x12345678 foi gravado nesta seqüência: 12, 34, 56, 78. Mas em C++ e em ambiente Intel, normalmente é gravado ao contrário - 78, 56, 34, 12 - ou seja, você vai ter de inverter os bytes após lê-los com readInt.
Além disso, você sabe que uma struct em C tem aquele problema de “padding”, ou seja:

struct dados {
 long numero;
 char nome [25];
 int   codigo;
}

dados.numero está na posição 0 (ok) e ocupa 4 bytes (ok)
dados.nome está na posição 4 (ok) e ocupa 25 bytes (ok)
a seguir, um padding é acrescentado para que dados.codigo fique em um endereço que é múltiplo de 4, no caso:
dados.codigo fica na posição 32 (devido ao padding) e ocupa 4 bytes.

Ou seja: dá trabalho e você precisa tomar bastante cuidado.

U

Passei a usar DataInputStream e DataOutputStream, funcionou para o problema inicial, mas agora tenho outro problema... os valores lidos não correspondem aos valores salvos no arquivo original.

private void openFile () {
			
		JFileChooser fileChooser = new JFileChooser ();
		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		int result  = fileChooser.showSaveDialog(this);
		
		if (result == JFileChooser.CANCEL_OPTION){
			System.out.println("Clicado CANEL");
		}
		
		File fileName = fileChooser.getSelectedFile();
		
		if (fileName == null || fileName.getName().equals("")){
			System.out.println("Erro no nome do arquivo");
		}
		else {
			try {
				file = new RandomAccessFile(fileName,"rw");		
                                cine.Tamanho = file.readLong();					
                                System.out.println(cine.Tamanho);
				file.close();
			} catch (FileNotFoundException e) {				
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

O primeiro valor salvo na struct é TAMANHO, um long que vale 19398656, mas quando mando ler o arquivo através da função acima, o valor exibido é 43984760079360. Por que isso??

Criado 28 de março de 2006
Ultima resposta 28 de mar. de 2006
Respostas 2
Participantes 2