Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Бинарный файл в текстовый файл


Автор: ElectroWave 10.5.2007, 14:09
Доброго время суток!
Нужна помощь. Есть бинарный файл с данными (численные значения). Как можно перегнать эти данные в текстовый файл? Для этого нужно знать структуру файла?

Автор: _hunter 10.5.2007, 14:48
Цитата(ElectroWave @  10.5.2007,  14:09 Найти цитируемый пост)
Для этого нужно знать структуру файла?

естественно...

Автор: ElectroWave 10.5.2007, 16:01
Предположим, я знаю структуру: 16 столбцов. Как узнать где именно нужно делать переход на другую строку или он сам перейдет если задать структуру?
Я тут в MSDN нашел такой примерчик, где здесь нужно поставить описание структуры: 

Код

// binary_read.cpp
// compile with: /clr
#include "stdafx.h"
#using<system.dll>
using namespace System;
using namespace System::IO;

int main() 
{
   String^ fileName = "test.out";
   String^ fileName_out = "textfile.txt";
   try
   {
      FileStream^ fs = gcnew FileStream(fileName, FileMode::Open);
      BinaryReader^ br = gcnew BinaryReader(fs);
      StreamWriter^ sw = gcnew StreamWriter(fileName_out);

      Console::WriteLine("contents of {0}:", fileName);
      while (br->BaseStream->Position < br->BaseStream->Length)
        sw->WriteLine(br->ReadInt32().ToString());
         //Console::WriteLine(br->ReadInt32().ToString());

      fs->Close( );
   }
   catch (Exception^ e)
   {
      if (dynamic_cast<FileNotFoundException^>(e))
         Console::WriteLine("File '{0}' not found", fileName);
      else
         Console::WriteLine("Exception: ({0})", e);
      return -1;
   }
   return 0;
}


... но он выдает не то, что мне нужно и по одной строке, совсем не те числа:
234417339
1091278168
853450298
1072652777
1503567587
1072017895
1932544722
1081344903
-954215220
-1071506953
-1737824698
1075923624
1860225844
1071492782
-1926941994
1065756451
-636921022
1070643184
880778520
-1074319773
68948893
-1079918038
149155141
-1075467444
98616177
-1075096470
189652504


Автор: Sartorius 10.5.2007, 16:19
Цитата

16 столбцов


 интересное у тебя описание структуры...  smile 

Автор: _hunter 10.5.2007, 16:24
Цитата(ElectroWave @  10.5.2007,  16:01 Найти цитируемый пост)
Как узнать где именно нужно делать переход на другую строку

переход на другую строку нужно делать сразу после того, как закончился текущий елемент структуры.

Автор: ElectroWave 10.5.2007, 16:30
я под структурой понял:
1 столбец - тип данных (long)
2 столбец - тип данных (long)
и т.д.
Если не так, поправьте.

Добавлено через 6 минут и 17 секунд
К примеру вот что там находится:
   time        X(север)      Y(восток)        H       Xv(м/c)    Yv(м/c)     Z(м/c)                    
443682.0068  5749901.6916  52511493.5102   825.7089   33.1911   -45.6565    -0.4673   

И какова структура этого файла? Поясните, плз, а то я че-то запутался.

Автор: _hunter 10.5.2007, 16:51
Цитата(ElectroWave @  10.5.2007,  16:30 Найти цитируемый пост)
1 столбец - тип данных (long)

cудя по наличию точки -- это точно не лонг (возможно дабл)

Цитата(ElectroWave @  10.5.2007,  16:30 Найти цитируемый пост)
И какова структура этого файла?

это тебе лучше знать...

только файл это не бинарний... -- прочтые даблы разделенные толи пробелами толи табами. новая запись начинается с новой строки. все...

Автор: ama_kid 10.5.2007, 16:52
ElectroWave, пробегавший рядом со мной телепат подсказал мне, что у тебя не бинарный файл, а... текстовый файл... smile  Элементами которого являются строки. А элементами строк - соответственно текстовые представления чисел типа double (ну или float)... Соответственно, чтобы это все считать, тебе надо считать строку из файла, потом сделать парсинг строки по пробелам (или, возможно, по символам Tab) и преобразовать каждую подстроку в число типа double... К сожалению, телепат убежал слишком быстро, я не успел узнать у него, что же ты из всего этого хочешь получить?  smile  У тебя ведь и так есть текстовый файл с требуемыми значениями, поэтому вопрос 
Цитата
Как можно перегнать эти данные в текстовый файл?
мне кажется непонятным...

Автор: ElectroWave 10.5.2007, 18:43
Сорри, видимо я ввел Вас в заблуждение, показав конечный результат этой проблемки. Файл изначально бинарный, а уж потом только получают такой вид в текстовом файле:

   time        X(север)      Y(восток)        H       Xv(м/c)    Yv(м/c)     Z(м/c)                    
443682.0068  5749901.6916  52511493.5102   825.7089   33.1911   -45.6565    -0.4673   

Как его получить? Можете примерчик привести, что-то не совсем въезжаю в тему про структуру.  smile 
Еще раз извините что не совсем корректно объяснил проблему. 

Автор: _hunter 10.5.2007, 19:16
ты уже в который раз упоминаеш таинственный бинарный файл таинственной структуры, но так ниразу его и не показал...
насчет чтения структур тут:
http://www.programmersheaven.com/mb/CandCPP/90195/90195/readmessage.aspx
почитай...

Автор: ElectroWave 10.5.2007, 21:39
Цитата(_hunter @ 10.5.2007,  19:16)
ты уже в который раз упоминаеш таинственный бинарный файл таинственной структуры, но так ниразу его и не показал...

я бы Вам его показал, но он весит 65 метров, обычно этот файл достигает 300-500 метров. 

Автор: _hunter 11.5.2007, 10:30
так что ты от нас хочеш?
хоть описание формата предоставь...

Автор: ElectroWave 11.5.2007, 10:47
Мне известно:
1. Файл бинарный с расширением .out;
2. Известно, что содержимое файла при перегоне (как, не известно) его в текст выглядит так:
443682.0068  5749901.6916  52511493.5102   825.7089   33.1911   -45.6565    -0.4673   63.8016    -0.1591     8.9255    -5.7316  0.3471   0.6846  -1.9832  0.0114   0.0054  -0.0076
443682.0118  5749901.8344  52511493.7534   825.7066   33.2009   -45.6545    -0.4604   63.7992    -0.1570     8.9323    -5.7316  0.3341  -1.9753  -0.9557  0.0084   0.0237  -0.0084
... и т.д.

вот все что мне известно.

Автор: _hunter 11.5.2007, 11:09
т.е. ничего не известно...

Автор: Sartorius 11.5.2007, 11:10
 Если уверен, что хедера нет, попробуй прочитать float double и long double и посмотри, где будет 443682.0068. Ну а дальше этот тип и читай...
 ЗЫ а вообще, если хочешь что б тебе помогли - выложи бинарник и текстовой вывод, который ему соответствует

Автор: ama_kid 11.5.2007, 12:29
Цитата(Sartorius @  11.5.2007,  11:10 Найти цитируемый пост)
выложи бинарник
Или хотя бы его первые 200 кБ, если уж он весит 60 метров...

Автор: Rapalex 11.5.2007, 12:36
1

Странно като, смотрю на этот код:
Цитата(ElectroWave @  10.5.2007,  16:01 Найти цитируемый пост)
#include "stdafx.h"#using<system.dll>
using namespace System;
using namespace System::IO;

int main()
 {   String^ fileName = "test.out";
   String^ fileName_out = "textfile.txt";

и думаю, ElectroWave, если пишеш на .NET то тебе не в этот раздел.


2

Sartorius, правильно сказал вначале нужно определится с типами в которых у тебя заданы числа.
А потом обявить структору с правильными типам, в правильном порядке. А дальше читай себе на здоровье....


3
Что касается бинарного файла, а ты уверен что это не сериализованиые обекты .нет-а или МФЦ?

Автор: ElectroWave 11.5.2007, 12:42
Спасибо за ответы и советы!   smile 
Думаю разберусь.

Автор: Rapalex 11.5.2007, 14:26
Тогда тему закрой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)