0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
1

Как побайтово считать файл и записать его в массив

18.09.2017, 21:27. Показов 9776. Ответов 19
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <time.h>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
   vector <char> ivector;
   ifstream f("TMI.rbs", ios_base::binary);
 
   while (f.eof()==0)
   {
       f>>ivector;  //в данном месте пишет ошибку
   }
 
    return 0;
}
затем надо будет обработать массив, как всё так и правильно его считать чтобы с ним можно было работать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2017, 21:27
Ответы с готовыми решениями:

Как правильно считать побайтово файл в массив
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;string&gt;...

Как побайтово считать Wav файл?
Так, чтобы у я мог с ним работать, а потом опять выгрузить его как wav файл?

Записать массив double в файл, и считать его
Допустим есть массив double *pdArrayOfAllWeight = (double*)malloc(sizeof(double)*iSumAllWeight);...

Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?...

19
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
18.09.2017, 21:41 2
Лучший ответ Сообщение было отмечено Swix41 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    
    ifstream f("TMI.rbs", ios_base::binary);
    if (!f)
    {
        cout << "Error opening file!" << endl;
        system("pause");
        return 0;
    }
    vector <char> ivector;    
    char ch;
    while (f.get(ch))
    {
        ivector.push_back(ch);
    }
3
0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
18.09.2017, 22:17  [ТС] 3
C++
1
2
3
4
5
6
7
 }     // можете теперь пояснить ?
    vector <char> ivector;    
    char ch;  // для чего это ?
    while (f.get(ch))   
    {
        ivector.push_back(ch);  //получается содержимое файла записалось в ivector? как это можно проверить?
    }
Добавлено через 8 минут
получается содержимое файла записалось в ivector? как это можно проверить?
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
18.09.2017, 23:04 4
Цитата Сообщение от Swix41 Посмотреть сообщение
как это можно проверить?
C++
1
2
for (int i = 0; i < ivector.size(); ++i)
        cout << ivector[i];
1
0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
19.09.2017, 11:39  [ТС] 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
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <time.h>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
    ifstream f("TMI.rbs", ios_base::binary);
        if (!f)
        {
            cout << "Error opening file!" << endl;
            system("pause");
            return 0;
        }
        vector <char> ivector;
        char ch;
        while (f.get(ch))
        {
            ivector.push_back(ch);
        }
        for (int i = 0; i < ivector.size(); i++)
          {
            cout << ivector[i];
          }
        system("pause");
        return 0;
}
данна я прога выводит какую то охинею вместо бинарного кода, его можно посмотреть при помощи Hex Workshop. Мне надо как то дальше обрабатывать полученную информацию а как не могу понять.
3 Из всего объема информации, поступившей на вход ЦТСУ за каждые 60 мс, в ЦТСУ формируется один телеметрический кадр следующей структуры:
№ слова ЦТСУ1 поток2 поток
177777777
2не анализироватьне анализировать
3не анализироватьне анализировать
4№ кадра№ кадра
5 -40не анализироватьне анализировать
41не анализироватьТЕСТ1
42не анализироватьТЕСТ2
43не анализироватьТЕСТ3
44-192не анализироватьне анализировать


Сформированные в ЦТСУ кадры выдаются в СТИ.
На выходе СТИ информация регистрируется и формируется в виде файла «ТМИ.rbs», в котором слова первого потока ЦТСУ нечетные, а слова второго потока ЦТСУ четные.
Через определенные промежутки в файл «ТМИ.rbs» добавляется временная метка (например 001E 008E). Метка добавляется по каждому потоку.
Необходимо обработать зарегистрированную ТМИ по несравнениям слов ТЕСТ1, ТЕСТ2, ТЕСТ3 во втором потоке каждого кадра.
Поиск несравнений начинать с номера кадра 16.
Результат сформировать в виде текстового протокола, в котором отразить:
1) первоначальное состояние слов ТЕСТ1, ТЕСТ2, ТЕСТ3;
2) номера кадров, в которых зафиксированы несравнения;
3) значения слов ТЕСТ1, ТЕСТ2, ТЕСТ3 в этих кадрах;
4) Общее число несравнений по каждому из слов ТЕСТ1, ТЕСТ2, ТЕСТ3.

вот такое задание
Вложения
Тип файла: rar TMI.rar (3.34 Мб, 4 просмотров)
0
Любитель чаепитий
3726 / 1786 / 561
Регистрация: 24.08.2014
Сообщений: 5,983
Записей в блоге: 1
19.09.2017, 12:33 6
Цитата Сообщение от Swix41 Посмотреть сообщение
как всё так и правильно его считать чтобы с ним можно было работать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
 
int main()
{
    std::ifstream file("TMI.rbs", std::ios::binary);
    
    if (file.is_open() == false)
    {
        std::cerr << "Can't open file\n";
        return 1;
    }
    
    std::vector<char> vec(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
}
1
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
19.09.2017, 21:33 7
Цитата Сообщение от Swix41 Посмотреть сообщение
выводит какую то охинею вместо бинарного кода
Если хочешь числа видеть (как в hex-редакторе), то приводи (при выводе) char к int (ну, и пробелами раздели):
C++
1
cout << hex << (int)ivector[i] << ' ';
Добавлено через 14 минут
И вектор тебе нужен с unsigned char.
1
0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
19.09.2017, 23:28  [ТС] 8
Цитата Сообщение от nd2 Посмотреть сообщение
Если хочешь числа видеть (как в hex-редакторе), то приводи (при выводе) char к int (ну, и пробелами раздели)
В hex редакторе шестнадцатеричные числа, а при int десятеричные выводит. как быть в таком случае?
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
19.09.2017, 23:40 9
Цитата Сообщение от Swix41 Посмотреть сообщение
как быть в таком случае?
7 пост смотри.

Добавлено через 2 минуты
Вывод тебе, вообще, для чего нужен?
1
0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
19.09.2017, 23:52  [ТС] 10
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
#include <cstdlib>
#include <time.h>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
    ifstream f("TMI.rbs", ios_base::binary);
        if (!f)
        {
            cout << "Error opening file!" << endl;
            system("pause");
            return 0;
        }
        vector <unsigned char> ivector;
        char ch;
        while (f.get(ch))
        {
            ivector.push_back(ch);
        }
        f.close();
        ofstream ofs("test.txt"); //создать
        for (int i = 0; i < ivector.size(); i++)
          {
              ofs << ivector[i];
          }
        ofs.close();
        system("pause");
        return 0;
}
задача считать побайтово hex файл и записать его в файл txt. В txt файле должны быть шестнадцатеричные числа(как на скрине Hex редактора), а на деле там непонятно что. помогите разобраться
Миниатюры
Как побайтово считать файл и записать его в массив  
Вложения
Тип файла: rar TMI.rar (3.34 Мб, 4 просмотров)
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.09.2017, 00:06 11
Цитата Сообщение от Swix41 Посмотреть сообщение
В hex редакторе шестнадцатеричные числа
Похоже на hex-редактор?
Миниатюры
Как побайтово считать файл и записать его в массив  
1
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
20.09.2017, 00:15 12
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
#include <iostream>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <string>
#include <cstdlib>
 
int main()
{
    std::string str;
    {
        std::ifstream input("input.txt", std::ios::binary);
        if (!input.is_open()) {
            return EXIT_FAILURE;
        }
        std::stringstream ss;
        ss << input.rdbuf();
        str = ss.str();
    }
    
    std::ofstream output("output.txt");
    if (!output.is_open()) {
        return EXIT_FAILURE;
    }
    output << std::hex << std::uppercase << std::setfill('0');
    size_t columns = 10;
    size_t width = 2;
    for (size_t i = 0; i < str.size(); ++i) {
        output << std::setw(2) << (unsigned)(unsigned char)str[i] << ' ';
        if (!((i+1) % columns)) {
            output << '\n';
        }
    }
}
1
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.09.2017, 02:32 13
...
Миниатюры
Как побайтово считать файл и записать его в массив  
1
0 / 2 / 0
Регистрация: 14.08.2017
Сообщений: 139
20.09.2017, 15:38 14
Для добавления очередного элемента в вектор, используйте функцию "push_back()". Промежуточный char ch, нужен, ибо сразу из потока не вставить в функцию байт.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// ConsoleApplication202.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <fstream>
#include <vector>
using namespace std;
 
int main()
{
    vector <char> vct;
    char ch;
    ifstream in("file.txt", ios::in | ios::binary);
    while(in.get(ch));
    {
        vct.push_back(ch);
    }
    _getch();
    return 0;
}
1
0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
20.09.2017, 19:38  [ТС] 15
Croessmah, а как сделать чтобы в файл записывались только значения например в файле значения записаны 00000000001E001E008E008E55555555AAAAAAAA7777777712 341234E03FE03F вот так, а как сделать так чтобы записывались значения второго потока, т.е. 00000000001E001E008E008E55555555AAAAAAAA7777777712 341234E03FE03F пропускаем первые 4 и записываем вторые 4 значения затем опять 4 пропускаем и снова 4 записываем и так далее до конца файла
, я пробовал менять условие цикла, но у меня выводилось часть правильно часть нет
0
0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
20.09.2017, 19:44  [ТС] 16
nd2, можете код проги скинуть полностью, вот у вас получилось то что надо
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.09.2017, 20:02 17
Общий код ты знаешь, код вывода вектора на скрине виден (для быстроты там 240 значений из вектора выведено). Ты не тем занялся, в задании ничего не говорится о выводе файла "ТМИ.rbs".
Цитата Сообщение от nd2 Посмотреть сообщение
Вывод тебе, вообще, для чего нужен?
0
0 / 2 / 0
Регистрация: 14.08.2017
Сообщений: 139
20.09.2017, 23:10 18
Например с помощью функции seekg().

Поправка.
Вот рабочая версия, с использованием seekg():

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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
 
int main()
{
    vector <string> vct;
    char ch[5];
    ifstream in("file.txt", ios::in | ios::binary);
    auto step = 0;
    for (int i = 0; i != 4; ++i )
    {
        in.seekg(step, ios::beg);
        in.get(ch, 5);
        cout << ch << endl;
        step += 8;
        vct.push_back(ch);
    }
 
    _getch();
    return 0;
}
1
0 / 0 / 0
Регистрация: 17.09.2017
Сообщений: 9
21.09.2017, 18:21  [ТС] 19
nd2, изначально в файле значения записаны 00000000001E001E008E008E55555555AAAAAAAA7777777712 341234E03FE03F вот так, а как сделать так чтобы записывались значения второго потока, т.е. 0000 001E 008E 5555 AAAA 7777 1234 E03F пропускаем первые 4 и записываем вторые 4 значения затем опять 4 пропускаем и снова 4 записываем и так далее до конца файла, цикл for для этого я сделал но в вектор не записывает получившуюся последовательность, тело цикла надо поправить. вы писалb цикл для whilt, с этим я разобрался, а для for это не работает
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
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <time.h>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
 
int main()
{
    ifstream f("TMI.rbs", ios_base::binary);
        if (!f)
        {
            cout << "Error opening file!" << endl;
            system("pause");
            return 0;
        }
        vector <unsigned char> ivector;
        char ch;
        while (f.get(ch))
        {
            ivector.push_back(ch);
        }
        f.close();
        //ofstream ofs("test.txt"); //создать
        vector <unsigned char> vec;
        
        
        for (int i = 2; i <ivector.size(); i=i+4)
          {
           vec.push_back();
          }
        
     
       // ofs.close();
        system("pause");
        return 0;
}
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
21.09.2017, 21:04 20
Цитата Сообщение от Swix41 Посмотреть сообщение
пропускаем первые 4 и записываем вторые 4 значения затем опять 4 пропускаем и снова 4 записываем
Пропускаем первые два байта (слово), читаем вторые два байта (слово), и т.д.:
C++
1
2
3
4
5
6
7
8
    vector <unsigned char> ivector;
    char byte1, byte2;
    while (f.ignore(2))
    {
        (f.get(byte1)).get(byte2);
        ivector.push_back(byte1);
        ivector.push_back(byte2);
    }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2017, 21:04
Помогаю со студенческими работами здесь

Нужно записать массив в файл, а потом из этого файла считать этот же массив
Помогите, пожалуйста, никогда с файлами делов не имела. Нужно записать массив в файл, а потом из...

Считать определённый символ из строки файла и записать его в массив
Как считать определённый символ из строки в файле и записать его в массив? Ещё не очень понятно...

Считать массив из файла, записать результаты в другой файл
Программа рабочая, нужно переделать, так чтобы массив считывался из файла и сумма со средним...

Считать текст из файла и записать его в другой файл, заменив каждую первую букву слов
Доброго времени суток Нуждаюсь в помощи. Есть задание: программа должна считывать английский...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru