Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Galenus
0 / 0 / 1
Регистрация: 18.12.2016
Сообщений: 19
#1

Аналоги методов работы с файлами из C в <fstream>C++

24.12.2016, 10:02. Просмотров 632. Ответов 5

Какие аналоги имеют f-ы из C(fread,fseek,ftell и т.д.) в библиотеке fstream в C++? Я знаю, что все f-ы работают в C++, но всё же моя цель - чтобы принимался путь типа string из <string>.

Например:
C++
1
2
3
4
5
6
7
8
9
10
#include <string>
#include <fstream>
 
int main()
 {
 string FilePath("C:");
 
 ifstream reading(FilePath.c_str(),ios::binary) ;// аналогично reading=fopen(const char* FilePath,'rb');
 return 0;
 }
Особенно интересна правильная замена fread :-)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2016, 10:02
Ответы с готовыми решениями:

fstream работа с файлами
Помогите написать прогу или хотя бы алгоритм размещения текста в несколько...

Работа с файлами fstream
есть дат файл концу этого файла надо добавить целое число: #include...

Принцип работы fstream
Допустим у нас есть файл из четырех чисел, например: 453 32 43 54. Я создаю...

Использование fstream для работы с ftp сервером
Здравствуйте. Имеется код: ifstream a;...

Структура состоящая из двух дробей и методов работы с ними(сложение, вычитание)
Пишем в Microsoft Visual Studio 2010 -&gt; Win32 Console Application -&gt; C++...

5
nd2
2831 / 2400 / 1055
Регистрация: 29.01.2016
Сообщений: 8,038
24.12.2016, 11:37 #2
http://www.cplusplus.com/reference/fstream/ifstream/
http://www.cplusplus.com/reference/fstream/ofstream/
0
Galenus
0 / 0 / 1
Регистрация: 18.12.2016
Сообщений: 19
25.12.2016, 09:01  [ТС] #3
Я не нашёл там полноценной замены fread(
0
Martein
678 / 89 / 15
Регистрация: 22.06.2014
Сообщений: 184
25.12.2016, 09:35 #4
Galenus, плохо ищете: http://www.cplusplus.com/reference/istream/istream/read/
Для чего вам вообще делать эту замену? Ведь string'ов в Си нет, например. Расскажите подробнее о вашем изобретении. Вдруг у вас велосипедные спицы длиннее радиуса колёс, а вы ещё не подозреваете об этом?
1
Galenus
0 / 0 / 1
Регистрация: 18.12.2016
Сообщений: 19
25.12.2016, 12:33  [ТС] #5
Я хотел модифицировать алгоритм чтения/сохранения BMP файла с этого сайта:
http://math.ivanovo.ac.ru/dalgebra/Khashin/gr/bmp/bmp.html
сохранив конечный вид массива v(одномерный массив, содержащий значения всех пикселей начиная с самого верхнего левого). Знаю, что полно других способов, более "элегантных", но мне кажется, что именно этот вариант наиболее понятен для новичков. Но он устарел и содержит много ошибок очевидных и не очень: начиная с того, что int слишком мал для наших целей и нужен как минимум unsigned int, заканчивая тем, что заголовок без помощи #pragma pack(push,1)|#pragma pack(pop) читается абсолютно неверно из-за разницы в размерах типов данных и данных заголовка. Я сам только начинаю осваивать программирование в общем и C++ в частности, но какие-то базовые исправления внести хотел бы, но я упёрся в эту строчку и не смог пока найти равноценную замену
C++
1
res = fread( tmp_buf, 1, mx3*my, f);
А что за вакханалия происходит после строчки "Перенос данных" я не понимаю даже близко, но оно работает....
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
 // Заголовок прочитан и проверен, тип - верный (BGR-24), размеры (mx,my) найдены
    int mx = bh.biWidth;
    int my = bh.biHeight;
    int mx3 = (3*mx+3) & (-4);    // Compute row width in file, including padding to 4-byte boundary
    unsigned char *tmp_buf = new unsigned  char[mx3*my];    // читаем данные
    res = fread( tmp_buf, 1, mx3*my, f);
    if( (int)res != mx3*my ) { delete []tmp_buf; fclose(f); return NULL; }
    // данные прочитаны
    fclose(f); 
 
    // выделим память для результата
    v = new int[mx*my];
 
    // Перенос данных (не забудем про BGR->RGB)
    unsigned char *ptr = (unsigned char *) v;
    for(int y = my-1; y >= 0; y--) {
        unsigned char *pRow = tmp_buf + mx3*y;
        for(int x=0; x< mx; x++) {
            *ptr++ = *(pRow + 2);
            *ptr++ = *(pRow + 1);
            *ptr++ = *pRow; 
            pRow+=3;
            ptr ++;
        }
    }
    delete []tmp_buf;
    return v;    // OK
0
nd2
2831 / 2400 / 1055
Регистрация: 29.01.2016
Сообщений: 8,038
25.12.2016, 12:47 #6
Цитата Сообщение от Galenus Посмотреть сообщение
и не смог пока найти равноценную замену
Цитата Сообщение от Galenus Посмотреть сообщение
res = fread( tmp_buf, 1, mx3*my, f);
C++
1
res = (f.read(tmp_buf, mx3*my)).gcount();
0
25.12.2016, 12:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2016, 12:47

Шаблонный класс для работы с разными типами данных и объявление методов в main
есть класс шаблонный, но не могу объявить методы в main и сделать длядругих...

Работы с файлами
нужно вывести на экран текст с фала такого типа: Структура &quot;№1&quot; -фио -год...

Организация работы с файлами.
Уважаемые формучане, выручайте! Нужно сдать последний зачет. Задача: В...


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

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

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