2016-01-29 2 views
1

У меня есть цикл, который успешно считывает первые 9 строк текстового файла в массив и соответствующим образом использует его. На каждом дополнительном проходе я хотел бы пропустить 9 строк текстового файла и переписать массив оттуда. (каждый раздел из 9 строк имеет один и тот же тип информации)Пропуск строк текстового файла при повторении цикла

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

Я думал, что самый простой подход заключается в том, чтобы увеличить переменную в этом цикле на текущее значение строк, которые я хочу пропустить, но это либо ничего не делало, не разбило программу, а приводило к сбою в работе, в зависимости от как я подошел к нему.

Это область текста, который в настоящее время передачи информации из текстового файла в 2D массив (и удаление пустого пространства)

for (int x = (0); x < BOARD_SIZE + 1; ++x) 
{ 
    for (int y = 0; y < BOARD_SIZE; ++y) 
    { 
     // Initializing as Z because that's not a possible input from file. 
     // If it appears something is wrong. 
     char point = 'Z'; 

     if (!file.get(point)) 
      cout << "There seems to be a problem with the file." << x << "," << y << endl; 

     if (isblank(point)) 
     { 
      // Without this, it will spit out spaces every other character of the array 
      --y; 
     } 
     else 
     { 
      chessBoards[x][y] = point; 
     } 
    } 
} 

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

ответ

1

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

Затем, в следующем цикле, вы можете использовать fsetpos, чтобы восстановить позицию текстового файла.

Вот как это сделать:

  • Сначала объявить переменную для хранения вашей позиции. Используемый тип: fpos_t
  • Затем в точке, где цикл достигает конца 9-й строки, используйте getpos, чтобы сохранить положение файла.
  • Вы можете получить позицию с помощью fsetpos и продолжить от того, где предыдущий цикл ушел от

    fpos_t поз;

    fgetpos (fp, & pos); // сохранить позицию

    fsetpos (fp, & pos); // теперь восстановить позицию, где мы сохранили

+0

Это определенно звучит как хороший подход.К сожалению, текстовый файл выбирается пользователем, и когда мне, видимо, приходится открывать файл, используя другой подход, который дает мне ошибки, когда я не использую константы. Разве это не так? Очень хорошо ответил. – Elliander

+0

Похоже, он тоже должен быть символом. – Elliander

1

Вот что я сделал, чтобы заставить его работать:

Пока файл не будет закрыт он не потеряет место, поэтому вместо того, чтобы закрывать его в конце петли и затем пытается заново, я имел это в верхней части цикла:

if (!file.is_open()) 
{ 
    file.open(games); 
} 

Это просто проверяет, является ли файл открытым. Если он не открыт, он откроет его. Таким образом, файл откроется при первом запуске и не будет пытаться снова открыть его. Затем файл может быть закрыт после завершения цикла.

Конечно, проще, чем изменять способ открытия или прохождения файлов в процессе хранения переменных, чтобы отслеживать вещи.

Смежные вопросы