Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2021, 23:17   #1
vladd97
Новичок
Джуниор
 
Регистрация: 10.07.2021
Сообщений: 2
По умолчанию Конвертация txt-файла в bin-файл, и наоборот. С++

Бьюсь уже второй день, ничего не работает. И код из этого обсуждения (https://stackoverflow.com/questions/...nary-file-in-c) тем более. Получается считывать данные из txt файла, а вот с бинарным полный провал... Вкратце, имеется некий входной txt-файл, где записаны числа. Строк может быть любое количество(в строке по числу 3-4).
vladd97 вне форума Ответить с цитированием
Старый 11.07.2021, 09:26   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Странный какой-то пример приведён.
Я так понимаю: на входе - текстовый файл с числами, на выходе - файл с теми же числами, но в бинарном представлении? Нужно определиться, какие числа будут на выходе - int? long int ? Считанную строку преобразовать в число и уж нужное число байт числа писать в бинарный.
На простом С без плюсов это бы звучало так (не уверен за давностью):
Код:
   fscanf (FileT,"%d",&tmp_int) ;
   fwrite(&tmp_int, sizeof(int), 1, FileB);
Это при условии: одна строка входного = одно число. Если в строке чисел несколько, нужно парсить эту строку, выделяя цифры.
Наоборот - таким же способом. Как-то так.
digitalis вне форума Ответить с цитированием
Старый 13.07.2021, 20:59   #3
vladd97
Новичок
Джуниор
 
Регистрация: 10.07.2021
Сообщений: 2
По умолчанию

вот мой пример, все работает за исключением обратного вывода из бин файла
https://pastebin.com/sKXS36vs
для переноса строки я использую флаг NAN
но когда идет обратное преобразование, я не могу избавиться от нан, он тоже печатается вместе с переносом строки
vladd97 вне форума Ответить с цитированием
Старый 13.07.2021, 21:43   #4
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Код:
#include <iostream>
#include <fstream>
#include <vector>

int main()
{
    const char txt_one[] = "file_text-1.txt";
    const char binary[] = "file_binary.bin";
    const char txt_two[] = "file_text-2.txt";

    // создаем текстовый файл с целыми числами
    {
        std::ofstream file(txt_one);
        for (int i = 0; i < 10; ++i)
            file << i * i * i << ' ';
        file << '\n';
    }
    std::cout << txt_one << " contains: " << std::ifstream(txt_one).rdbuf();

    // считывание чисел в вектор
    std::vector<int> seq;
    {
        std::ifstream file(txt_one);
        int i;
        while (file >> i)
            seq.push_back(i);
    }
    std::cout << "the vector contains: ";
    for (int v : seq)
        std::cout << v << ' ';
    std::cout << '\n';

    // запись чисел вектора в бинарном формате
    {
        std::ofstream file(binary, std::ios::binary);
        for (int v : seq)
            file.write(reinterpret_cast<const char*>(&v), sizeof(v));
    }

    // чтение чисел из двоичного файла
    // запись чисел в текстовый файл
    {
        std::ifstream infile(binary, std::ios::binary);
        std::ofstream outfile(txt_two);
        int v;
        while (infile.read(reinterpret_cast<char*>(&v), sizeof(v)))
            outfile << v << ' ';
        outfile << '\n';
    }
    std::cout << txt_two << " contains: " << std::ifstream(txt_two).rdbuf();
}
Источник: converting between text files and binary files
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 06.08.2021, 09:37   #5
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Код:
#include <fstream>
#include <windows.h>
int main()
{
 std::ifstream in1;
 HANDLE in2;
 HANDLE out1;
 std::ofstream out2;
 DWORD Readed;
 int i;
 in1.open("D:\\Projects\\cpp\\Test\\Test\\numbers1.txt");
 out1=CreateFile("D:\\Projects\\cpp\\Test\\Test\\numbers.bin", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, NULL, 0);
 while (!(in1.eof()))
 {
  in1>>i;
  WriteFile(out1, &i, sizeof(i), nullptr, NULL);
 }
 in1.close();
 CloseHandle(out1);
 in2=CreateFile("D:\\Projects\\cpp\\Test\\Test\\numbers.bin", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, 0);
 out2.open("D:\\Projects\\cpp\\Test\\Test\\numbers2.txt");
 do
 {
  ReadFile(in2, &i, sizeof(i), &Readed, NULL);
  if (Readed==sizeof(Readed))
  {
   out2<<i<<std::endl;
  }
 } while (Readed==sizeof(Readed));
 CloseHandle(in2);
 out2.close();
 return 0;
}
Исходник грязный, не проверяет ни успех создания файлов, ни успех их открытия, ни успех записи, ни успех чтения из текстового файла, а закрывается всегда «без ошибок». Причешите его самостоятельно.

Последний раз редактировалось taras-proger77; 06.08.2021 в 12:33.
taras-proger77 вне форума Ответить с цитированием
Старый 06.08.2021, 09:40   #6
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
#include <vector>
Он здесь не нужен.
taras-proger77 вне форума Ответить с цитированием
Старый 07.08.2021, 02:27   #7
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Не нужен где именно?
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 13.08.2021, 06:30   #8
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Не нужен где именно?
В этой задаче. Для конвертации файла в файл в форматах, хранящих некоторое количество несвязанных отдельных значений, без оптимизации дисковых операций на уровне прикладного кода достаточно дёргать каждое значение, а контейнерные типы не нужны. Вот если бы задача была конвертировать растр из bmp в png или чертёж из бинарного формата в текстовый, тогда чтение всего файла может быть оправдана. Или если бы стояла задача оптимизации дисковых операций. А если каждый из файлов на два-три порядка больше оперативной памяти? Всё равно будете целиком читать? Или запихаете ещё и в промежуточный файл виртуальной памяти? А если каждый из файлов на порядок больше даже не фактического размера физической оперативной памяти, а адресного пространства оперативной памяти? Всё равно приметесь целиком читать?

Последний раз редактировалось taras-proger77; 13.08.2021 в 06:33.
taras-proger77 вне форума Ответить с цитированием
Старый 16.08.2021, 21:42   #9
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Ваше решение конечно же шедевр, спору нет.
Выполняется даже ОЗУ не нужно, просто класть туда нет чего

P. S.
Для больших объемов данных есть функция malloc, позволяет читать данные блоками заданного размера. Полезно при ограниченных ресурсах.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переделавание кода на считывание из файла в файл output.txt input.txt !!! airesjke Помощь студентам 0 29.05.2013 14:07
Конвертация float->string и наоборот qwerty_kap Общие вопросы C/C++ 1 28.05.2012 10:34
конвертация int16[] to byte[] и наоборот Teksa Общие вопросы .NET 5 20.07.2010 09:27