Проблема с iostream, сначала запишите файл в двоичном режиме, затем преобразуйте и сохраните ASCII - PullRequest
2 голосов
/ 16 февраля 2011

Я использую iostream для сбора данных с устройства. Сначала я записываю файл в режиме ASCII, он работает хорошо, но занимает довольно много времени. Затем я переключаюсь, чтобы писать в двоичном режиме, и это быстрее.

float dist[41616];
ofstream d_ofs( "numbers.dat",ios::out |ios::app|ios::binary);

// this is from the device API getting distance datas
 res = GetDistances (hnd, dist, sizeof dist);

d_ofs.write((char*)&dist,sizeof dist);
d_ofs.close();

После сбора данных я должен преобразовать данные из "numbers.txt", чтобы они были доступны для чтения моим преподавателем, в текстовый файл. Я предполагаю, что это должно изменить двоичные необработанные данные на ASCII. поэтому я сначала читаю файл, а затем пишу в формате ASCII.

Я получаю числа, но, к сожалению, они не являются правильными числами. Я предполагаю, что должен быть специальный формат для этого процесса преобразования. Но до сих пор я не нашел решение из-за моих слабых знаний в области кодирования. Так может кто-нибудь дать мне рука? Большое спасибо заранее.

Вот мой код:

double fnum[41616]; // here is the mistake,it should be float[]
ifstream in("numbers.dat", ios::in | ios::binary);
in.read((char *) &fnum, sizeof fnum);
MessageBox("Read File done");
ofstream fout("output.txt");
for(int k=0; k<41616; k++) // show values read from file
    fout <<dec<<"\t" << fnum[k] ;
in.close();
fout.close();

Заключаем:

Моя глупая ошибка в типе данных. Я написал double [] вместо float [] во второй части. Это действительно смущает. Надеюсь, этот пост может помочь начинающим, таким как я.

1 Ответ

2 голосов
/ 16 февраля 2011

Вы, похоже, сохраняете как float и читаете как double.Чтение (как правило) будет в два раза больше записи, поэтому каждый прочитанный вами дубль будет фактически читать два записанных числа с плавающей запятой.Из-за этого вы получите неправильные числа.

попробуйте изменить

double fnum[41616]

на

float fnum[41616]

Кроме того, лучше не вызывать двоичный файлФайл * .txt немного сбивает с толку.Это также сбивает с толку вызов двойного массива fnum - так как f предлагает float

...