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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 62, средняя оценка - 4.81
one050704
1 / 1 / 0
Регистрация: 02.06.2009
Сообщений: 104
#1

Конвертировать bmp файл в txt - C++

27.07.2010, 19:29. Просмотров 7914. Ответов 24
Метки нет (Все метки)

Необходимо написать программу для конвертации монохромного bmp файла, в файл txt, где содержимое будет в виде ascii кодов в 16- ричном виде.
В-общем думается для начала открыть bmp файл для чтения, читать побитно, открыть для записи txt файл, каждый бит bmp менять на ascii коды в hex формате и записать все это в txt. Господа формучане, как думаете это есть верный алгоритм?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2010, 19:29     Конвертировать bmp файл в txt
Посмотрите здесь:
C++ В папке К2 создайте файл t3.txt, в который перепишите вначале текст из файла t1.txt, а затем из t2.txt
Переписать все числа из файлов 1.txt и 2.txt в файл 3.txt C++
C++ Найти минимальное и максимальное числа из input.txt и записать его в файл output.txt
C++ Считать 10 целых чисел с файла 1.txt и записать в файл 2.txt максимальный элемент и его индекс
C++ Переписать данные файла input.txt в файл output.txt, отсортировать их в алфавитном порядке по фамилии
Исправить программу, чтоб считывала текст из файла Input.txt и выводит в файл Output.txt C++
C++ отладить программу на языке С++, которая считывает из файла a.txt строку и записывает её в файл b.txt в обратном порядке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
27.07.2010, 19:33     Конвертировать bmp файл в txt #2
one050704, во-первых не побаино а побайтно
ну да это верный алогоритм в txt файле у тебя будет hex бинарника, только нпонятно зачем тебе это надо
one050704
1 / 1 / 0
Регистрация: 02.06.2009
Сообщений: 104
27.07.2010, 19:42  [ТС]     Конвертировать bmp файл в txt #3
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
one050704, во-первых не побаино а побайтно
ну да это верный алогоритм в txt файле у тебя будет hex бинарника, только нпонятно зачем тебе это надо
Для освоения языка Си, думается. Насчет байтов, вы правы. Вот незадача как считать все пиксели изображения? Завести одномерный массив типа int для пикселей(количество пикселей высчитать вручную исходя из разрешения картинки), завести цикл пока не будет EOF байты просто переписать под hex(используя fwrite)?
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
27.07.2010, 19:47     Конвертировать bmp файл в txt #4
one050704, а вы знаете что bmp файл состоит не только из описания пикселей
у него еще есть заголовки
поищите в интернете "Структура bmp файла"
а если вам нужно весь файл(включая заголовки), то да берете по байту пока не EOF и сразу переводите в hex
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
27.07.2010, 19:52     Конвертировать bmp файл в txt #5
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <fstream>
 
int main()
{
    char* in = "img.bmp";
    char* out = "out.txt";
    std::ifstream ifs(in);
    if(!ifs)
    {
        std::cerr << "Error opening \"" << in << "\" for input" << std::endl;
        system("pause");
        return EXIT_FAILURE;
    }
    std::ofstream ofs(out);
    if(!ofs)
    {
        std::cerr << "Error opening \"" << out << "\" for output" << std::endl;
        system("pause");
        return EXIT_FAILURE;
    }
    char ch;
    while(ifs.get(ch))
    {
        if(!ifs)
        {
            std::cerr << "Error reading from \"" << in << "\"" << std::endl;
            system("pause");
            return EXIT_FAILURE;
        }
        ofs << "0x" << std::hex << static_cast<int>(ch) << " ";
        if(!ofs)
        {
            std::cerr << "Error writing to \"" << out << "\"" << std::endl;
            system("pause");
            return EXIT_FAILURE;
        }
    }
    system("pause");
    return EXIT_SUCCESS;
}
Читает весь файл.
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
27.07.2010, 19:54     Конвертировать bmp файл в txt #6
Nameless One, блин, ну он же сказал что это ему надо для самообчения
нафиг ему твой готовый код? только в рамку вставить и на стенку повесить
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
27.07.2010, 19:56     Конвертировать bmp файл в txt #7
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
Nameless One, блин, ну он же сказал что это ему надо для самообчения
нафиг ему твой готовый код? только в рамку вставить и на стенку повесить
Так он собирался на С писать, а это С++. Так что не вижу, в чем проблема.
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
27.07.2010, 19:58     Конвертировать bmp файл в txt #8
Nameless One, не в этом суть...
суть в том что он новичок и хочет учиться, просто вы зря эту прогу писали
5 минут на работе потеряны зря
Nameless One
27.07.2010, 20:05
  #9

Не по теме:

Ничего такого, что не обсуждалось бы уже в этой теме, в моей программе нет. А было, напомню:

Цитата Сообщение от one050704 Посмотреть сообщение
открыть bmp файл для чтения, читать побитно, открыть для записи txt файл, каждый бит bmp менять на ascii коды в hex формате и записать все это в txt
Таким образом, мой код на С++ можно рассматривать как форму записи вышеприведенного алгоритма. А для записи этого алгоритма на С топикстартеру придется использовать уже другие средства.

one050704
1 / 1 / 0
Регистрация: 02.06.2009
Сообщений: 104
28.07.2010, 07:28  [ТС]     Конвертировать bmp файл в txt #10
Добавлено через 25 секунд
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
Nameless One, блин, ну он же сказал что это ему надо для самообчения
нафиг ему твой готовый код? только в рамку вставить и на стенку повесить
Честно говоря, не понял листинга что выше т.к. Си, а уж тем более С++ не особо владею.
Но спасибо, он как наглядное пособие, попробую его разобрать(операторы незнакомые в нем), ну и написать свою программу.

Добавлено через 9 часов 26 минут
Нашел прототип функции fwrite:
C
1
size_t fwrite(const void *буфер, size_t колич_байт, size_t счетчик, FILE *указатель файла);
Не понимаю 1 . size_t счетчик - это по сколько байт записывать? 2. size_t колич_байт - общее количество байт, которое надо записать?
И самое не понятное 3. const void *буфер, что это за буфер? В некоторых примерах там указаны адреса переменных, т.е. то, что надо записать в файл. А в моем случае что указать?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
28.07.2010, 07:37     Конвертировать bmp файл в txt #11
C++
1
2
3
4
5
6
size_t fwrite(
   const void *buffer,
   size_t size,
   size_t count,
   FILE *stream 
);
Параметры:
Код
buffer - Pointer to data to be written.

size - Item size in bytes.

count - Maximum number of items to be written.

stream - Pointer to FILE structure.
Функция возвращает количество записанных символов.
  1. buffer - указатель на данные, которые нужно записать в поток.
  2. size - можно оставить sizeof(char) (это размер в байтах одного элемента записываемого массива)
  3. count - максимальное число записываемых символов
  4. stream - указатель на структуру FILE
Вот пример использования:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// crt_fread.c
// This program opens a file named FREAD.OUT and
// writes 25 characters to the file.  It then tries to open
// FREAD.OUT and read in 25 characters.  If the attempt succeeds,
// the program displays the number of actual items read.  
#include <stdio.h>
 
int main( void )
{
   FILE *stream;
   char list[30];
   int  i, numread, numwritten;
 
   // Open file in text mode:
   if( fopen_s( &stream, "fread.out", "w+t" ) == 0 )
   {
      for ( i = 0; i < 25; i++ )
         list[i] = (char)('z' - i);
      // Write 25 characters to stream 
      numwritten = fwrite( list, sizeof( char ), 25, stream );
      printf( "Wrote %d items\n", numwritten );
      fclose( stream );
 
   }
   else
      printf( "Problem opening the file\n" );
 
   if( fopen_s( &stream, "fread.out", "r+t" ) == 0 )
   {
      // Attempt to read in 25 characters 
      numread = fread( list, sizeof( char ), 25, stream );
      printf( "Number of items read = %d\n", numread );
      printf( "Contents of buffer = %.25s\n", list );
      fclose( stream );
   }
   else
      printf( "File could not be opened\n" );
}
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
28.07.2010, 07:40     Конвертировать bmp файл в txt #12
one050704,
1. кол-во байт- размер одного элемента (char- 1; int- 4 и т.д.)
2. счетчик- сколько элментов надо записать
3. буфер- это указатель на блок памяти откуда будет записываться

допустим у тебя есть строка
char str [1000];
тебе нужно записать 32 символа
ты пишешь так
C++
1
fwrite(str, sizeof(char), 32, f);
one050704
1 / 1 / 0
Регистрация: 02.06.2009
Сообщений: 104
28.07.2010, 08:10  [ТС]     Конвертировать bmp файл в txt #13
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
one050704,
C++
1
fwrite(str, sizeof(char), 32, f);
Ура, что-то записано в файл. А как вставить можно спецификацию типа %x, чтобы перевести все 16 ричный вид?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
28.07.2010, 08:13     Конвертировать bmp файл в txt #14
Использовать не fwrite, а fprintf.
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
28.07.2010, 08:14     Конвертировать bmp файл в txt #15
one050704, для этого используй другие функции
fwrite используют для бинарных файлов
используй fprintf
то же что и printf, но первым параметром еще указаывается файловый поток
C++
1
fprintf(f, "%x", i);
one050704
1 / 1 / 0
Регистрация: 02.06.2009
Сообщений: 104
28.07.2010, 09:01  [ТС]     Конвертировать bmp файл в txt #16
Вот что у меня пока получилось(только не смейтесь), не могу понять, как завести цикл, для записи в файл?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
int i;
char *d;
  FILE *fp;
  FILE *f;
  if((f=fopen("pic.bmp", "wb+"))==NULL)
  {
    printf("Cannot able to open file \n");
    return 0;
  }
 
  f=fopen("pic.bmp","rb");
  fp=fopen("text.txt", "wb");
  d=&f;
  for(d=0;d!='\0';d++)
    fprintf(fp,"%x",d);
  fclose(fp);
  fclose(f);
  }
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
28.07.2010, 09:12     Конвертировать bmp файл в txt #17
one050704, нее у тебя тут код совсем неправильный
C++
1
if((f=fopen("pic.bmp", "wb+"))==NULL)
во первых ты уже открыл файл, причем даже стер его

C++
1
if((f=fopen("pic.bmp", "rb"))==NULL)
напиши вот так, а второй раз этот файл не надо открывать


считывается с файла так
C++
1
2
3
int n;
while (n=fgetc(f)!= EOF)
    fprintf(fp, "%X", n);
файл для записи открывай как текстовый
C++
1
fp=fopen("text.txt", "w");
one050704
1 / 1 / 0
Регистрация: 02.06.2009
Сообщений: 104
28.07.2010, 14:53  [ТС]     Конвертировать bmp файл в txt #18
one050704, нее у тебя тут код совсем неправильный
считывается с файла так
C++
1
2
3
int n;
while (n=fgetc(f)!= EOF)
    fprintf(fp, "%X", n);
круто, работает, но выдает одни только еденички(11111...). С чем это может быть связано?

Добавлено через 5 часов 1 минуту
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
one050704, а вы знаете что bmp файл состоит не только из описания пикселей
у него еще есть заголовки
поищите в интернете "Структура bmp файла"
а если вам нужно весь файл(включая заголовки), то да берете по байту пока не EOF и сразу переводите в hex
D@rkD@iver, а если не весь файл, заголовок файла сохранить оставить, а палитру конвертировать. Для начала думаю хотя бы объявить заголовок в виде структуры. А вот что потом...?
D@rkD@iver
111 / 111 / 3
Регистрация: 01.10.2008
Сообщений: 876
28.07.2010, 14:55     Конвертировать bmp файл в txt #19
one050704, что-то я тебя не совсем понял... поясни
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2010, 09:29     Конвертировать bmp файл в txt
Еще ссылки по теме:
C++ Прочитать txt и записать в другой txt файл
C++ В файле input.txt содержатся сведения о группе студентов. переписать данные файла в файл output.txt, отсортировав их по возрастанию
Сформировать из файла f4.txt файл g.txt C++
Как конвертировать файл в base64? C++
C++ BMP - файл

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
29.07.2010, 09:29     Конвертировать bmp файл в txt #20
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
нафиг ему твой готовый код? только в рамку вставить и на стенку повесить
При всём уважении не могу согласиться.

Изучить чужой код- суть написать свой. Я так учился в том числе.

Вот готовый проект кому надо. Сперва ознакомиться с файлом "Текустовый документ"
Yandex
Объявления
29.07.2010, 09:29     Конвертировать bmp файл в txt
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru