Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для SaynorPRO
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122

Как лучше оформить чтение двумерного массива посимвольно?

18.02.2017, 20:10. Показов 1743. Ответов 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
void labyrinthRead(int r, int c, int labyrinth[][MAX]) {
  FILE *fp = fopen("input.txt", "r");
  if (r < 10 && c < 10) {
    fseek(fp, 5, SEEK_SET);
  }
  if ((r >= 10 && c < 10) || (r < 10 && c >= 10)) {
    fseek(fp, 6, SEEK_SET);
  }
  if (r >= 10 && c >= 10) {
    fseek(fp, 7, SEEK_SET);
  }
  for (int i = 0; i < r; i++) {
    for (int j = 0; j < c + 1; j++) {
      char ch;
      ch = getc(fp);
      switch(ch) {
        case 'X': {
          labyrinth[i][j] = -1;
          break;
        }
        case ' ': {
          labyrinth[i][j] = 0;
          break;
        }
        case 'F': {
          labyrinth[i][j] = 1;
          finish_i = i;
          finish_j = j;
          break;
        }
        case 'S': {
          labyrinth[i][j] = 0;
          start_i = i;
          start_j = j;
          break;
        }
      }
    }
  }
}
Ввод выглядит так:
Code
1
2
3
4
5
6
7
8
9
10
11
10 14
XXXXXXXXXXXXXX
X          XXX
X XFXXXXX    X
XXX   XX  XX X
X S          X
XX  XXXXXX X X
X        X X X
X X      X X X
XXX XX       X
XXXXXXXXXXXXXX
Можно ли сделать это более изящным и надёжным способом? Можно ли сразу перекинуть каретку на вторую строку или вообще обойтись без манипуляций с ней?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2017, 20:10
Ответы с готовыми решениями:

Найти сумму каждого столбца двумерного массив, оформить в виде одномерного массива
найти сумму каждого столбца двумерного массива A(n,m).оформить в виде одномерного массива

Как лучше оформить event?
Добрый день, имеется такая конструкция вызова эвента: namespace name_Space_Main_Form { public partial class Form1 : Form ...

Как лучше оформить таблицу?
Добрый день. на сайте хочу создать таблицу с переводом популярных слов на один иностранный язык с 3 колонками: 1. слово 2....

5
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
18.02.2017, 20:54
Цитата Сообщение от SaynorPRO Посмотреть сообщение
Можно ли сразу перекинуть каретку на вторую строку или вообще обойтись без манипуляций с ней?
Можно, конечно. Зачем она, вообще, в файле? Что происходит в коде до цикла for()?
0
 Аватар для SaynorPRO
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
18.02.2017, 21:15  [ТС]
nd2,

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
60
61
62
63
64
65
66
67
68
69
#include <fstream>
#include <queue>
#include <vector>
#include <iomanip>
#include <algorithm>
 
using namespace std;
 
ifstream in ("input.txt");
ofstream out ("output.txt");
 
const int MAX = 21;
int start_i = 0, start_j = 0, finish_i = 0, finish_j = 0;
 
 
 
void labyrinthRead(int r, int c, int labyrinth[][MAX]) {
  FILE *fp = fopen("input.txt", "r");
  if (r < 10 && c < 10) {
    fseek(fp, 5, SEEK_SET);
  }
  if ((r >= 10 && c < 10) || (r < 10 && c >= 10)) {
    fseek(fp, 6, SEEK_SET);
  }
  if (r >= 10 && c >= 10) {
    fseek(fp, 7, SEEK_SET);
  }
  for (int i = 0; i < r; i++) {
    for (int j = 0; j < c + 1; j++) {
      char ch;
      ch = getc(fp);
      switch(ch) {
        case 'X': {
          labyrinth[i][j] = -1;
          break;
        }
        case ' ': {
          labyrinth[i][j] = 0;
          break;
        }
        case 'F': {
          labyrinth[i][j] = 1;
          finish_i = i;
          finish_j = j;
          break;
        }
        case 'S': {
          labyrinth[i][j] = 0;
          start_i = i;
          start_j = j;
          break;
        }
      }
    }
  }
}
 
int main() {
  int labyrinth[MAX][MAX] = {{}};
  int r = 0, c = 0;
  in >> r >> c;
  labyrinthRead(r, c, labyrinth);
  for (int i = 0; i < r; i++) {
    for (int j = 0; j < c; j++) {
      out << setw(3) << labyrinth[i][j] << ' ';
    } out << endl;
  }
  return 0;
}
Если вызвать функцию getc() без сдвига каретки, то она начнёт считывать с начала файла. Можете сами попробовать.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
18.02.2017, 22:25
Лучший ответ Сообщение было отмечено SaynorPRO как решение

Решение

Цитата Сообщение от SaynorPRO Посмотреть сообщение
Если вызвать функцию getc() без сдвига каретки, то она начнёт считывать с начала файла.
Начнёт, только зачем ты в функции второй раз файл открываешь?
Цитата Сообщение от SaynorPRO Посмотреть сообщение
C++
1
FILE *fp = fopen("input.txt", "r");
Добавлено через 3 минуты
Достаточно, в main(), вот это сделать, и курсор в файле будет в начале второй строки:
C++
1
2
in >> r >> c;
in.get();
И не нужно, в функции, второй раз открывать уже открытый файл. Или открывай его только в функции, или передавай туда ссылку на открытый файловый поток:
C++
1
void labyrinthRead(int r, int c, int labyrinth[][MAX], ifstream& in);
Добавлено через 7 минут
Цитата Сообщение от nd2 Посмотреть сообщение
или передавай туда ссылку на открытый файловый поток:
А в твоём коде вообще можно не передавать, так как ты сделал поток глобальным (зачем?), он и так везде виден будет.

Добавлено через 4 минуты
Цитата Сообщение от SaynorPRO Посмотреть сообщение
Как лучше оформить чтение двумерного массива посимвольно?
Лучше оформить так: сначала читаешь из файла размер необходимой памяти (данные в первой строке), выделяешь необходимую память, читаешь туда данные из файла.
1
 Аватар для SaynorPRO
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
18.02.2017, 23:29  [ТС]
nd2, кстати, а где можно найти информацию по i/o потокам? Гугл, к сожалению, ничего вразумительного не даёт
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
18.02.2017, 23:37
Цитата Сообщение от SaynorPRO Посмотреть сообщение
где можно найти информацию по i/o потокам?
Много где. Например, в любой книге по С++.
Цитата Сообщение от SaynorPRO Посмотреть сообщение
Гугл, к сожалению, ничего вразумительного не даёт
Сомневаюсь, по-моему, там полно информации. Вразумительная она для кого-то или нет - этого не знаю.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2017, 23:37
Помогаю со студенческими работами здесь

Как лучше оформить телефонный справочник???
Добрый день всем участникам форума!!! Ребята есть такой вопрос. Делаю телефонный справочник Учреждений. Использую вот такую базу...

Чтение двумерного массива
Нужно считать двумерный массив через scanf. Переменная через scanf считывается так: scanf (&quot;%d&quot;, &amp;n). Элемент...

Подскажите как лучше оформить код с указателями
Подскажите пожалуйста, какой вариант лучше предпочесть и почему? int main(int argc, char** argv) { QApplication app(argc,...

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

Запись и чтение двумерного массива
Всем привет! Задание достаточно интересное и не простое, кто поможет - спасибо огромное! Имеется папка, к примеру (folder1). В данной...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru