C/Visual C - No detecto EOF

   
Vista:

No detecto EOF

Publicado por Jose Luis (3 intervenciones) el 14/11/2009 22:15:27
Buen dia,

Solicito su orientación para poder detectar el fin de archivo y salir del bucle.

Anexo las instrucciones que estoy utilizando.

Cabe mencionar que soy nuevo en C y estoy leyendo archivos binarios SEGY.

f1 = fopen (name, "rb");
...
fseek(f1,3600,SEEK_SET);
while (!feof(f1))
{
for (i=0;i<=50;i++)
{
if (i!=0) fseek (f1, pt[i] - pt[i-1] - ft[i-1], SEEK_CUR);
if (ft[i] == 2)
{
fread (&int2, sizeof(int2), 1, f1);
printf ("%11d ", entero2(int2));
}
else
{
fread (&int4, sizeof(int4), 1, f1);
printf ("%11d ", entero4(int4));
}
}
fseek (f1, _nsmp * _smpl + (241 - pt[i-1] - ft[i-1]) , SEEK_CUR);
printf(" %d \n", feof(f1));
}
fclose(f1);

Saludos desde Villahermosa, Tabasco, Mexico, America.
José Luis
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:No detecto EOF

Publicado por Capitan Kirk (94 intervenciones) el 14/11/2009 23:11:35
Los archivos binarios no llevan marca de fin de fichero, ya que, precisamente por ser binarios, pueden contener cualquier código ASCII incluyendo el de fin de fichero (que es ASCII 26), sin que necesariamente sea el fin del fichero. Para saber si has llegado al fin del fichero, debes conocer su estructura. Quizás en alguna parte indique el número de registros que hay actualmente en el fichero, o se indique el final mediante algún registro especial, etc. Las posibilidades son infinitas, así que si no conoces cómo está organizada la información no hay nada que hacer.

Siento no poder darte más indicaciones.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No detecto EOF

Publicado por José Luis (3 intervenciones) el 15/11/2009 02:17:34
Gracias por su orientacion.

Ateriormente calculaba el numero de registros, pero para archivos mayor de 4GB no puedo obtener el tamaño con ftell, tenemos hasta archivos de 500gb.
.

fseek(f1,0,SEEK_END);
i = ftell(f1);
fseek (f1, 3200+17-1, SEEK_SET);
fread (&int2, sizeof(int2), 1, f1);
_si = entero2(int2)/1000000.;
fseek (f1, 3200+21-1, SEEK_SET);
fread (&int2, sizeof(int2), 1, f1);
_nsmp = entero2(int2);
fseek (f1, 3200+25-1, SEEK_SET);
fread (&int2, sizeof(int2), 1, f1);
_frmt = entero2(int2);
if (_frmt==3) _smpl=2;
else if(_frmt==6) _smpl=1;
else _smpl=4;
_trl = 240+_nsmp*_smpl;
printf("_trl = 240+_nsmp*_smpl; %d \n",_trl);
_ntr=(i-3600)/(_trl);
printf("-----------------\n");
printf("File: %s\n",name);
printf("Sample interval : %g\n",_si);
printf("Number of samples: %d\n",_nsmp);
printf("Data format : %d\n",_frmt);
printf("Number of traces : %d\n",_ntr);
printf("-----------------\n");

for (n=1;n<=_ntr;n++)
{
for (i=0;i<=50;i++)
{
fseek (f1, 3600+((n-1)*_trl)+pt[i]-1, SEEK_SET);
if (ft[i] == 2)
{
fread (&int2, sizeof(int2), 1, f1);
printf ("%11d ", entero2(int2));
}
else
{
fread (&int4, sizeof(int4), 1, f1);
printf ("%11d ", entero4(int4));
}
}
printf("\n");
}
fclose(f1);

ahora re-formulare mi pregunta.

Saludos desde Villahermosa, Tabasco, Mexico, America
Jose Luis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar