Форум программистов, компьютерный форум CyberForum.ru

Функцией перевода текстового файла в бинарный - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Ma3au
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 14
05.02.2014, 16:03     Функцией перевода текстового файла в бинарный #1
Собственно задача состоит в следующем. Нужно сделать из текстового файла, который содержит текст и числа, бинарный. И заполнить структуру данными из него.
Для изменения использую вот такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Conv( string nametxt, string namebin ){
    ofstream bin_stata ( namebin , ios::binary );
    ifstream input_file( nametxt );
    char temp; 
    if( input_file.is_open() ){
        while ( !input_file.eof() ){
            input_file.read ( &temp, sizeof(temp) );
            bin_stata.write( &temp, sizeof(temp));
        }
        input_file.close();
        bin_stata.close();
    }
}
Но в полученном файле абсолютно такая же информация, только в конце бинарного есть 0.
Для обоих файлов использую формат *.txt вдруг это влиет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2014, 16:03     Функцией перевода текстового файла в бинарный
Посмотрите здесь:

Строки читаются из текстового файла функцией fgets и указатели на них помещаются в структуру данных... C++
C++ Занести в бинарный файл h из текстового файла t целые числа, упорядоченные по возрастанию
помогите с функцией перевода из 16 в 10 систему в С++ C++
Данные из текстового файла записать в бинарный файл C++
Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
05.02.2014, 16:20     Функцией перевода текстового файла в бинарный #2
Ну так всё так и должно быть. Текстовый формат - это всего лишь подвид бинарного. Берёте бинарный файл и говорите, что определённое количество байт стоящих подряд задают код символа. И, вуаля, вот вам текстовый. А по сколько именно байт и какие коды какому символу соответствуют - это зависит от кодировки текста (например, ASCII, UTF, UNICODE и т.д.). Преобразовывать текст в бинарный формат занятие бессмысленное. А вот если там есть, например, цифры, вроде "123 456 789" разделённых чем угодно, но в моём примере пробелом. Тогда нужно по очереди выделить каждую цифру в отдельную строку "123", "456", "789" и к каждой применить atoi или sscanf. И Вы получите свои числа, например в массиве int, который уже можно писать в файл. Только вот в блокноте бинарный файл всё равно нормально не отобразится, для этого нужен какой-нибудь HEX редактор.



PS: расширение влияет только на то, какая программа будет открывать файл при двойном клике. Содержание файла, при изменении расширения, не меняется.
Ma3au
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 14
05.02.2014, 17:01  [ТС]     Функцией перевода текстового файла в бинарный #3
Да там могут встретиться такие числа.
В задании ещё присутствует вот такое вот условие : "При работе с двоичными файлами продемонстрировать возможность за одно обращение считывать или записывать несколько компонент."
Не совсем понимаю что именно от меня требуется, не могли бы вы объяснить?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
05.02.2014, 17:07     Функцией перевода текстового файла в бинарный #4
Ну значит открываете файл, например, fopen, читаете, например, fscanf сразу в целочисленный массив (или float, смотря какие числа там у вас), а потом пишите его в бинарный файл.

Добавлено через 47 секунд
как примерно текстовый файл будет выглядеть?
Ma3au
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 14
05.02.2014, 17:29  [ТС]     Функцией перевода текстового файла в бинарный #5
komand1 2 0 3 4 5 0
komand2 2 3 5 0 2 0
Я пытался использовать записывать их в структуру с помощью потоков fstream, read и write. Но вывод в файл тоже не устроил и я стёр, решив сделать через фун-ии.
Кстати, вот вид структуры
C++
1
2
3
4
5
6
7
8
9
10
struct statistic {
 
    string name;
    int win;
    int lose;
    int draw;
    int goal;
    int miss;
    int score;
};
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
05.02.2014, 17:48     Функцией перевода текстового файла в бинарный #6
Ну тогда тебе самая дорога читать с помощью fscanf по строкам. Как-то так должно работать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FILE*f1=fopen("input_filename.txt","r")
FILE*f2=fopen("output_filename.bin","w")
 
char name[10];
int val[6];
 
if ((f1!=NULL) && (f2!=NULL))
{
    while(!feof(f1))
    {
        fscanf(f1, "%s %i %i %i %i %i %i\n", name, &val[0], &val[1], &val[2], &val[3], &val[4], &val[5]);
        fprintf(f2, "%s", name);
        fwrite(&val, sizeof(int), 6, f2);
    }
    fclose(f1);
    fclose(f2);
}

Код не компилировал, так набросал. Но работать должно, хотя могут быть опечатки.
Ma3au
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 14
05.02.2014, 17:59  [ТС]     Функцией перевода текстового файла в бинарный #7
А можешь подсказать, что можно почитать где доступно и понятно объясняют про такой способ ввода( scanf и printf), а то всю свою короткую практику использовал cout и cin
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
05.02.2014, 18:17     Функцией перевода текстового файла в бинарный #8
scanf и printf очень удобные штуки. суть в том, что в форматной строке ты задаёшь шаблон текста, например "POINT%i(%f,%f,%f)", и он ищет такой текст, но вместо %i любое целое число, а вместо %f любое float. Т.е. в моём примере под шаблон "POINT%i(%f,%f,%f)" подойдут строки типа "POINT1(1.5,37.95,4.0)" или "POINT58(5.8,3.5,0.058)". А потом в переменные, перечисленные после форматной строки пишется найденное в соответствии с порядком в шаблоне. т.е. в
C++
1
scanf("POINT%i(%f,%f,%f)",&ii,&ff1,&ff2,&ff3)
первое целое запишется в ii, а действительные числа в порядке очереди в ff1, ff2 и ff3.



Вот тут и тут есть подробно о scanf. Первая ссылка на русском, а вторая на английском.

А вот тут и ещё тут о printf.



А вот тут и ещё тут подробно описано какие символы в форматной строке что означают.


Если тебе нужно считать пару несвязанных значений, то cin идеален, а вот для форматированного ввода, вывода тебе нужно использовать printf и scanf. Кстати у них есть варианты для работы со строками sprintf и sscanf. Суть та же, но читает и пишет строки.
Ma3au
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 14
05.02.2014, 18:34  [ТС]     Функцией перевода текстового файла в бинарный #9
Спасибо большое!
И ещё вопрос появился. Бинарный файл fscanf так же хорошо читать будет? Или лучше воспользоваться чем то другим для записи значении в структуру из полученного бинарного файла?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
05.02.2014, 18:38     Функцией перевода текстового файла в бинарный #10
Бинарный файл - это файл в котором всё хранится числами по байтам. А scanf для строк создан. Так что бинарник сами читайте. Тут fwrite может помочь и fread.

Добавлено через 39 секунд
В смысле самому придётся за форматом следить.
Ma3au
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 14
05.02.2014, 19:38  [ТС]     Функцией перевода текстового файла в бинарный #11
C++
1
2
FILE *f1 = fopen("statabin.txt", "r");
    fscanf(f1, "%s%i%i%i%i%i%i", team[0].name, &team[0].win, &team[0].lose, &team[0].draw, &team[0].goal,  &team[0].miss, &team[0].score);
Попробовал записать первую структуру из получившегося файла, но ничего не изменилось
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
06.02.2014, 11:42     Функцией перевода текстового файла в бинарный #12
Т.е. не изменилось? В этом коде
Цитата Сообщение от Ma3au Посмотреть сообщение
C++
1
2
FILE *f1 = fopen("statabin.txt", "r");
fscanf(f1, "%s%i%i%i%i%i%i", team[0].name, &team[0].win, &team[0].lose, &team[0].draw, &team[0].goal, *&team[0].miss, &team[0].score);
ты только читаешь в team[0]

Добавлено через 30 секунд
Т.е. в полях team[0] должны быть твои значения.

Добавлено через 2 минуты
И зачем тебе структура, да и ещё массив из них. Тебе же нужно писать сразу, как только читаешь? разве нет? Задача ведь конвертирование файла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 15:36     Функцией перевода текстового файла в бинарный
Еще ссылки по теме:

C++ Отобрать из текстового файла в бинарный информацию
Из текстового файла считать матрицу и записать ее в бинарный файл C++
Считать данные из текстового файла, переписать в бинарный, и вывести в виде выровненной таблицы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ma3au
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 14
06.02.2014, 15:36  [ТС]     Функцией перевода текстового файла в бинарный #13
Всё спасибо большое, разобрался. Мне нужно было ещё вывести итоговую таблицу отсортированную на основе этих данных
Yandex
Объявления
06.02.2014, 15:36     Функцией перевода текстового файла в бинарный
Ответ Создать тему
Опции темы

Текущее время: 10:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru