Пропустить строки чтения во входном файле С++

Итак, я пытаюсь прочитать входной файл в двумерный массив.

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

Вот входной файл под названием «Fruit.txt»:

Oroblanco Grapefruit
Winter
Grapefruit

Gold Nugget Mandarin
Summer
Mandarin

BraeBurn Apple
Winter
Apple

И мой код:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

const int MAX_ROW = 6;
const int MAX_COL = 4;

void FileInput(string strAr[MAX_ROW][MAX_COL])
{

ifstream fin;

fin.open("Fruit.txt");

int columnIndex;
int rowIndex;

rowIndex = 0;

while(fin && rowIndex < MAX_ROW)
{
    columnIndex = 0;

    while(fin && columnIndex < MAX_COL)
    {
        getline(fin, strAr[rowIndex][columnIndex]);
        fin.ignore(10000,'\n');

        columnIndex++;

    }

    rowIndex++;
}


fin.close();
}

Мой код на данный момент хранит его так:

Oroblanco Grapefruit // strAr[0][0]
Grapefruit           // strAr[0][1] 

Gold Nugget Mandarin // strAr[0][2]
Mandarin             // strAr[0][3]

BraeBurn Apple       // strAr[1][0]
Apple                // strAr[1][1]

Я хочу, чтобы это было так:

Oroblanco Grapefruit // strAr[0][0]

Gold Nugget Mandarin // strAr[0][1]

BraeBurn Apple       // strAr[0][2]

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


person Ken Casimiro    schedule 07.05.2017    source источник


Ответы (2)


Ваш код в порядке, просто исправьте переменную columnIndex.

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

fin.ignore(10000,'\n');
fin.ignore(10000,'\n');
fin.ignore(10000,'\n');
person Kamal Zidan    schedule 07.05.2017
comment
В качестве еще одного способа сделать это вы можете перейти к строкам, которые делятся на 4, и прочитать только их. См. мой ответ здесь вы можете узнать больше о методах. - person Shadi; 07.05.2017

Есть несколько проблем с вашим кодом:

  1. colIndex — неиспользуемая переменная, возможно, проблема с опечаткой;
  2. MAX_COL должно быть 3, а не 4;
  3. Порядок rowIndex, columnIndex неправильный.

Вместо

const int MAX_COL = 4;
while(fin && rowIndex < MAX_ROW)
{
    colIndex = 0;  // unused variable

    while(fin && columnIndex < MAX_COL)   // MAX_COL should be 3
    {
        getline(fin, strAr[rowIndex][columnIndex]);  // order problem
        fin.ignore(10000,'\n');

        columnIndex++;

    }

    rowIndex++;
}

использовать это:

const int MAX_COL = 3;  // MAX_COL should be 3
while(fin && rowIndex < MAX_ROW)
{

    columnIndex = 0;   // variable name fixed.
    while(fin && columnIndex < MAX_COL)
    {
        getline(fin, strAr[columnIndex][rowIndex]); // order matters
        if (strAr[columnIndex][rowIndex].empty() == false || 
            no_need_to_ignore()) {  // your sikp logic added here
            columnIndex++;
        }
    }
    rowIndex++;
}
person luoluo    schedule 07.05.2017
comment
Можно ли как-то исправить это с помощью другого игнорирования в моем коде? и его 6 (разнообразие фруктов) и 4 для количества сезонов. (забыл указать в своем посте) - person Ken Casimiro; 07.05.2017
comment
strAr[columnIndex][rowIndex].empty() == false эта строка помогает игнорировать пустые строки. Есть ли другие строки, которые нужно пропустить? @WuWuKennyWu - person luoluo; 07.05.2017
comment
да, я хочу игнорировать сезон и тип фруктов. Я только хочу сохранить название плода. например: Oroblanco Grapefruit, Winter, Grapefruit находится в моем входном файле. Я только хочу, чтобы он читался на Oroblanco Grapefruit и пропускал следующие два, чтобы получить название следующего фрукта. - person Ken Casimiro; 07.05.2017
comment
@WuWuKennyWu обновил ответ, возможно, вам нужно добавить логику, чтобы проверить, следует ли вам выполнять операцию игнорирования. - person luoluo; 07.05.2017