Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708

Что-то не так со считыванием

26.02.2021, 22:16. Показов 543. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть заключается в том, что длина файла 10000, а i по выходу из цикла while равна 9756. То есть запись из файла прекращается и оставшиеся байты заполнены мусором 0xCD. Что я делаю не так...
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
ifstream fin;
    fin.open (path, ios_base :: binary | ios_base :: app | ios_base :: in);
    if(!fin.is_open())
    {
        cerr << "File couldn't be opened for reading!" << endl;
        exit (CANT_OPENED);
    } 
 
    // Allocation dynamic memory
    u8 *data;
    fin.seekg(0, ios::end);
    u64 length = fin.tellg();
    fin.seekg(0, ios::beg);
    data = new u8 [length];
    size_t i = 0;
 
    // Reading from a file to an array 
    while (!fin.eof())
    {
        fin >> data[i++];
    }
    
    cout << (int) data[length-2]<<endl;
    cout << (int) data[length-3]<<endl;
    cout << (int) data[length-4]<<endl;
    cout << "Checkpoint" << endl;
    fin.close();
Добавлено через 55 минут
Получилось поправить код, но только это с помощью си)
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
    FILE* fin;
    const char* c = path.c_str();
    fin = fopen (c, "rb");
    if(fin == NULL)
    {
        cerr << "File couldn't be opened for reading!" << endl;
        exit (CANT_OPENED);
    } 
 
    // Allocation dynamic memory
    fseek(fin, 0, SEEK_END);
    size_t length = ftell(fin);
    fseek(fin, 0, SEEK_SET);
    u8 *data = new u8 [length];
    size_t i = 0;
    for (; i < length; i++)
        data[i] = getc(fin);
    
    /*while (!fin.eof())
    {
        fin >> data[i++];
    }*/
    // Reading from a file to an array 
    cout << (int) data[length-2]<<endl;
    cout << (int) data[length-3]<<endl;
    cout << (int) data[length-4]<<endl;
    cout << "Checkpoint" << endl;
    fclose(fin);
Добавлено через 24 минуты
Почему в первом случае не проходит чтение до конца файла?

Добавлено через 32 минуты
Почему в первом случае поток заполняется мусором?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2021, 22:16
Ответы с готовыми решениями:

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при открытии программы\игры Фуллскрином. т.е...

И так, что не так с моим запросом на добавление записи в таблицу?
$sql = 'INSERT INTO product ' . '(name, code, price, category_id, brand, availability,' . 'description,...

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
Вот код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(){ float a,c; char b; skip: ...

15
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.02.2021, 22:25
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
Почему в первом случае не проходит чтение до конца файла?
Может быть потому, что в первом случае у тебя один цикл
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
while (!fin.eof())
а в втором - другой
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
for (; i < length; i++)
?
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,002
26.02.2021, 22:32
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
while (!fin.eof())
вот это точно неправильно

попробуй так
C++
1
2
3
4
5
6
    std::ifstream file("путькфайлу",std::ios::binary);
    if(file.is_open())
    {
        std::vector content((std::istreambuf_iterator<char>(file)),{});
                 ...
    }
1
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
26.02.2021, 22:41  [ТС]
oleg-m1973, логично)) Только вот у меня теперь вопрос, string это массив char'ов. А что если мне нужно в динамический массив типа uint8_t записать... Когда я в него записываю у меня последние ячейки заполняются мусором...

Добавлено через 1 минуту
Алексей1153,
C++
1
std::vector content((std::istreambuf_iterator<char>(file)),{})
А вот можно эту строчку по подробнее... Непонятно до конца что происходит...
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,002
26.02.2021, 22:46
Andy_Coldfield, создаётся вектор content и инициализируется двумя итераторами istreambuf_iterator: первый будет считывать из файла содержимое, а второй - просто обозначает конец ввода (и ничего, по сути, не делает)

кстати, лучше указать тип вектора так std::vector<uint8_t> ........ , а то выведется как std::vector<char>
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
26.02.2021, 22:50  [ТС]
Алексей1153, странно получается, пишет что размер 127... Но такого быть не может
C++
1
vector <uint8_t> content((std::istreambuf_iterator<char>(fin)), {});
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.02.2021, 22:53
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
oleg-m1973, логично)) Только вот у меня теперь вопрос, string это массив char'ов. А что если мне нужно в динамический массив типа uint8_t записать... Когда я в него записываю у меня последние ячейки заполняются мусором...
Если тебе нужно считать весь текстовый файл, то сделай просто
C++
1
std::string s = (std::stringstream() << std::ifstream(path).rdbuf()).str();
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,002
26.02.2021, 22:53
Andy_Coldfield, а файл какого размера?
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
26.02.2021, 23:23  [ТС]
Алексей1153, 10000

Добавлено через 1 минуту
oleg-m1973, у меня не текстовый фfйл, у меня тип uint8_t. В массив как считать, чтобы не заполнялся мусором.
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,002
26.02.2021, 23:27
Andy_Coldfield, а std::ios::binary в конструкторе указан?
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
26.02.2021, 23:33  [ТС]
Алексей1153,
C++
1
ifstream fin (path, ifstream :: binary || ifstream ::  in);
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,002
26.02.2021, 23:35
Andy_Coldfield,

|| - это булево И, нужно | - побитовое

да и вообще, in не нужен - класс ifstream его сам подставляет. Нужен только std::ios::binary
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
26.02.2021, 23:43  [ТС]
Алексей1153,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ifstream fin (path, ios :: binary | ios ::  in);
    if(!fin.is_open())
    {
        cerr << "File couldn't be opened for reading!" << endl;
        exit (CANT_OPENED);
    }
    
    // Allocation dynamic memory
    fin.seekg(0, ios::end);
    u64 length = fin.tellg();
    fin.seekg(0, ios::beg);
    size_t i = 0;
    u8* data = new u8 [length];
    while (!fin.eof())
    {
        fin >> data[i++];
    }
Все равно обрывается
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,002
26.02.2021, 23:50
Andy_Coldfield, посмотри пост №3

Добавлено через 3 минуты
Andy_Coldfield, а твоим способом тоже можно, но больше букафф

C++
1
2
3
4
5
6
7
8
9
10
    std::vector<uint8_t> content;
    std::ifstream file("путькфайлу",std::ios::binary);
    if(file.is_open())
    {
        file.seekg(0, std::ios::end);
        const auto length = file.tellg();
        file.seekg(0, std::ios::beg);
        content.resize(length);
        file.read((char*)content.data(), content.size());
    }
кстати, тут ещё неплохо бы чтение в try/catch обернуть. Вдруг подсунут здоровенный файл )
1
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
27.02.2021, 00:04  [ТС]
Алексей1153,
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
ifstream fin (path, ios :: binary | ios ::  in | ios :: app);
    if(!fin.is_open())
    {
        cerr << "File couldn't be opened for reading!" << endl;
        exit (CANT_OPENED);
    }
    size_t length;
    std::vector<uint8_t> content;
    std::ifstream file(path, std::ios::binary);
    if (file.is_open())
    {
        file.seekg(0, std::ios::end);
        length = file.tellg();
        file.seekg(0, std::ios::beg);
        content.resize(length);
        file.read((char*)content.data(), content.size());
    }
    
 
    cout << (int) content[length - 1]<<endl;
    cout << (int)content[length - 2]<<endl;
    cout << (int)content[length - 3]<<endl;
 
    cout << "Checkpoint" << endl;
В вектор все корректно записывает. Спасибо.. А почему в массив не получается...

Добавлено через 4 минуты
Спасибо) разобрался)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ifstream fin (path, ios :: binary | ios ::  in | ios :: app);
    if(!fin.is_open())
    {
        cerr << "File couldn't be opened for reading!" << endl;
        exit (CANT_OPENED);
    }
    size_t length;
    u8* data;
    std::ifstream file(path, std::ios::binary);
    file.seekg(0, std::ios::end);
    length = file.tellg();
    file.seekg(0, std::ios::beg);
    data = new u8[length];
    if (file.is_open())
    {
        file.read((char*)data, length);
    }
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,002
27.02.2021, 00:07
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
ifstream fin
а это зачем оставлено?

Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
А почему в массив не получается.
всё получается. Точно так же
C++
1
2
3
4
5
6
7
8
9
10
...
        file.seekg(0, std::ios::end);
        const auto length = file.tellg();
        file.seekg(0, std::ios::beg);
        uint8_t* content=new uint8_t[length];
        file.read((char*)content, length);
 
        /*delete [] content;
        content=0;*/
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2021, 00:07
Помогаю со студенческими работами здесь

Что в коде ни так? while не работает так, как ожидаю
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от 702 до 1000. Что ни так понимаю, где...

сегодня так можно сказать праздник так что...
простите меня за все пожалуйста!!!

Как сделать так, чтобы выпадающее меню одного фрейма выпадало поверх другого? Что не так в моем коде?
Как сделать так, чтобы выпадающее меню одного фрейма выпадало поверх другого? Что не так в моем коде? Знаю, что фреймы давно устарели, но...

Что не так, почему так происходит?
Вот bat файл @echo off for /f %%A in ('wmic path Win32_NetworkAdapter where &quot;PNPDeviceID like '%%VID_22C3&amp;PID_55FF%%'&quot; get Index...

Как сделать так,что бы программа выбирала за указанием что выбрать
program trainmath; {Программа де ми зможемо,тренирувати наші мат.здібності} var r,a,b,g,p:integer; {Змінні} label m,n,c,v; begin ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru