С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227

Чтение данных блоками из файла

10.08.2017, 01:13. Показов 3909. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как прочитать данные из файла блоками или наиболее просто ?
файл состоит из 2-х байтных чисел через пробел те

0 0 0 11 100 255 0 0
23 25 5 1 0 0 0 1024 0

и тд
размер известен 1600х1600 чисел.
метод чтения через ifstream...
голову сломал уже не получается
те скопировать в двумерный массив int data[1600][1600]
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2017, 01:13
Ответы с готовыми решениями:

Чтение блоками из потока
Всем привет. Пытаюсь решить такую задачу, нужно читать поток блоками заданного размера, например по 10 метров. И каждый такой блок...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include<iostream> #include<fstream> #include<locale.h> #include<iomanip> #include <cstdlib> using namespace std; struct...

Чтение из файла определённого места и сортировка данных исходя из этих данных
Есть некий текстовый документ, содержащий информацию о посещении сайта в формате: Например 12.5.76.200 04:23 Mon Цель:...

11
71 / 71 / 55
Регистрация: 04.06.2016
Сообщений: 237
10.08.2017, 01:41
Читай файл построчно,строку разбивай на подстроки с одним числом,преобразуй подстроки в int и записывай в массив.
0
1615 / 1181 / 552
Регистрация: 08.01.2012
Сообщений: 4,558
10.08.2017, 01:55
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    //0 0 0 11 100 255 0 0 
    //23 25 5 1 0 0 0 1024 0 
    ifstream fin("f.txt");
    char s[10000];
    while(fin.getline(s,sizeof(s)))
    {
        string ss(s);
        istringstream is(ss);
        while(is>>ss)
            cout<<atoi(ss.c_str())<<" ";
        cout<<endl;
    }
    fin.close();
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
10.08.2017, 02:20  [ТС]
Так и делаю

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while(!fout.eof()) 
   {
    fout.read(&ch,1);
 
    if(ch == '\n') j++;
    else
    if(ch == ' ' )
       {
       data[i][j] = StrToInt(kl);
       i++;
       kl="";
       }
       else kl +=ch;
 
   }
   fout.close();
тут правда возникает ошибка где то пробел добавляется к последнему числу строке что ли еще не понял
Но хочется конечно более красиво

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    //0 0 0 11 100 255 0 0 
    //23 25 5 1 0 0 0 1024 0 
    ifstream fin("f.txt");
    char s[10000];
    while(fin.getline(s,sizeof(s)))
    {
        string ss(s);
        istringstream is(ss);
        while(is>>ss)
            cout<<atoi(ss.c_str())<<" ";
        cout<<endl;
    }
    fin.close();
Добавлено через 42 секунды
Что то я ничего не понял, а где массив ?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.08.2017, 04:47
Цитата Сообщение от whale2 Посмотреть сообщение
размер известен 1600х1600 чисел
Размер чего? Чисел в файле? 1600 строк по 1600 чисел? Раз известен, то в чём проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int data[1600][1600];
    
    ifstream fin("file.txt");
    if (fin)
    {
         for (int i = 0; i < 1600; ++i)
             for (int j = 0; j < 1600; ++j)
                 fin >> data[i][j];
 
         fin.close();
    }
    else
        cout << "Error opening file!" << endl;
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
10.08.2017, 10:46  [ТС]
Так работает но читает долго, думал можно как то быстрее загружать.
Объясните пожалуйста, как в вашей проге так ловко убираются пробелы и перенос каретки ?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
10.08.2017, 11:41
Цитата Сообщение от MansMI Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
while (fin.getline(s, sizeof(s)))
{
    string ss(s);
    istringstream is(ss);
    while (is >> ss)
        cout << atoi(ss.c_str()) << " ";
    cout << endl;
}
C++
1
2
3
4
5
6
7
while(fin.getline(s,sizeof(s)))
{
  std::istringstream strm(ss);
  int n;
  while (strm >> n)
    std::cout << n << " ";
}
и что произойдёт, если конец буфера попадёт на середину числа?
то есть, допустим, у нас файл:
10 10 10 10 10
и размер буфера 13.
тогда в буфер попадёт: 10 10 10 10 1, а 0 останется в файле и при следующем чтении будет считан 0, вместо 10.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
10.08.2017, 14:20  [ТС]
Еще непонятки, не в тему темы но все равно, есть

C++
1
2
3
4
Graphics::TBitmap               *gBitmap = new Graphics::TBitmap();
gBitmap->PixelFormat=pf24bit;
gBitmap->Width  = 1600+3;
gBitmap->Height = 1600+3;
массив с данными data[1600][1600]

грузим в него данные цвета

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for( int y=0; y!=1600; y++)
    {
     ptr = (Byte *)gBitmap->ScanLine[1600-y]; 
     for( int x=0; x<4800; x+=3)
     {
     r1= data[x/3][y];
     g1=r1;
     b1=0;
 
     ptr[x-0] = (Byte)b1;
     ptr[x+1] = (Byte)g1;
     ptr[x+2] = (Byte)r1;
     }
    }
далее надо вывести на канву чтобы изображение подгонялось под размер канвы

C++
1
Image1->Canvas->StretchDraw(Image1->Canvas->ClipRect, gBitmap);
но вот хоть тресни, подгоняется только по одной стороне а вторая становиться равно этой, хотя propotional=false
те на канву выводиться квадратное изображение со стороной = меньшей у канвы.


Если делать вручную то все выводиться отлично но долго

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Hi = Image1->Height;
Wi = Image1->Width;
ym = 1600/Hi;
xm = 1600/Wi;
 
for( int x=0; x!=1600; x++)
 for( int y=0; y!=1600; y++){
 
     qa = data[x][y];
     
     y /=ym;
     x /=xm;
 
     Image1->Canvas->Pixels[x][Hi-y]=RGB(qa,qa,0);
 
     }
Где собака зарыта ?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.08.2017, 14:46
Цитата Сообщение от whale2 Посмотреть сообщение
но читает долго
Делай в Release (и файл в бинарном режиме открой) - будет не долго.
Цитата Сообщение от whale2 Посмотреть сообщение
как в вашей проге так ловко убираются пробелы и перенос каретки ?
Этим занимается оператор >>.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
10.08.2017, 14:56  [ТС]
Шайтан !
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
10.08.2017, 19:36
Вот нормальное чтение двумерного массива положительных чисел из файла:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <cstdlib>
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
  int i=0,j=0,k=0;  
  int acc=0;
  char c;
  
  int X[6][5]; // Размеры можно менять...
  
  ifstream finp;
 
    finp.open("file.txt");
    
    while (1)    
    {
       if (finp.eof()) break;   
       finp.get(c);
       switch (c)
       {
          case ' ':
          {
              if (k) X[i][j++]=acc;
              acc=0;
              k=0;
              break;
          }    
          case '\n':
          {
              if (k) X[i++][j]= acc; 
              acc=0;
              j=0;
              k=0;
              break;
          }    
          default:
          {
              acc=acc*10+(c-'0');
              k++;
              break;
          }
       } 
    }     
    
    finp.close();
    
    for (i=0; i<6; i++)
    {
      for (j=0; j<4; j++) cout << X[i][j] << " ";
      cout << endl;
    }  
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Содержимое файла:

Code
1
2
3
4
5
6
12 34 56 78
12 34 56 78
12 34 56 78
12 34 156 78
12 34 56 78
12 34 56 979
Вывод:

12 34 56 78
12 34 56 78
12 34 56 78
12 34 156 78
12 34 56 78
12 34 56 979
Для продолжения нажмите любую клавишу . . .

Добавлено через 14 секунд
Вот нормальное чтение двумерного массива положительных чисел из файла:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <cstdlib>
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
  int i=0,j=0,k=0;  
  int acc=0;
  char c;
  
  int X[6][5]; // Размеры можно менять...
  
  ifstream finp;
 
    finp.open("file.txt");
    
    while (1)    
    {
       if (finp.eof()) break;   
       finp.get(c);
       switch (c)
       {
          case ' ':
          {
              if (k) X[i][j++]=acc;
              acc=0;
              k=0;
              break;
          }    
          case '\n':
          {
              if (k) X[i++][j]= acc; 
              acc=0;
              j=0;
              k=0;
              break;
          }    
          default:
          {
              acc=acc*10+(c-'0');
              k++;
              break;
          }
       } 
    }     
    
    finp.close();
    
    for (i=0; i<6; i++)
    {
      for (j=0; j<4; j++) cout << X[i][j] << " ";
      cout << endl;
    }  
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Содержимое файла:

Code
1
2
3
4
5
6
12 34 56 78
12 34 56 78
12 34 56 78
12 34 156 78
12 34 56 78
12 34 56 979
Вывод:

12 34 56 78
12 34 56 78
12 34 56 78
12 34 156 78
12 34 56 78
12 34 56 979
Для продолжения нажмите любую клавишу . . .
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
11.08.2017, 11:50  [ТС]
Если нет метода чтобы читать сразу строками то метод предложенный nd2 меня вполне устраивает, все читает.
Возможно ваш метод более универсальный.

А никто с масштабированием не поможет ? не пойму в чем тут дело.
Не хочет подгонять изображение на две стороны...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2017, 11:50
Помогаю со студенческими работами здесь

Чтение данных из файла
Очень нужна помощь: никак не получается написать функцию чтения из файла на С++ Есть на С, но хочу на С++, все никак не выходит Вот...

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

Чтение данных из файла
Доброго времени, долго искал ответ, решил все таки спросить. Есть файл в котором такие данные TTT ppp 5 5 5 EEE aaa 3 3 3 DDD vvv 6...

Чтение данных из файла С++
Здравствуйте. Дан простой пример потокового ввода/вывода дисковых файлов из Лафоре ООП С++. // форматированный вывод в файл //...

Чтение данных из файла
Здравствуйте, в программе нужно прочитать данные из файла и записать результат в ассоциативный массив всё работает, только не понятно...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru