colocando um arquivo de lista (.txt) em uma matriz 2D


0

Estou tentando separar um arquivo de texto (que tem uma lista de 200 strings) e armazenar cada outra string (número par e número ímpar na lista) em uma matriz 2D.

O arquivo de texto é ordenado desta maneira (sem os números):

  1. Alabama
  2. Brighton
  3. Arkansas
  4. Bermudas
  5. Averton
  6. Burmingham

Eu gostaria de armazená-lo em um array bidimensional chamado strLine [101] [2], repetindo-o de maneira que a primeira string da lista esteja no local [0] [0] e a segunda string da lista no local [0] [1], etc, até o arquivo terminar de ler e a lista ser organizada assim (sem os números):

  1. Alabama | Brighton
  2. Arkansas | Bermudas
  3. Avertinon | Burmingham

Meu código exibe a lista original não classificada no momento, gostaria de saber como implementar a matriz 2d (com sintaxe correta) e como implementar um loop for i, j na função getline () para que ele possa percorrer cada elemento da matriz 2D.

Qualquer ajuda seria muito apreciada.

Meu código:

bool LoadListBox()
{

    // Declarations
    ifstream fInput;                                // file handle
    string strLine[201];                            // array of string to hold file data
    int index = 0;                                  // index of StrLine array
    TCHAR szOutput[50];                             // output to listbox, 
    50 char TCHAR

    // File Open Process
    fInput.open("data.txt");                        // opens the file for read only
    if (fInput.is_open())
    {
        getline(                                    // read a line from the file
            fInput,                                 // handle of file to read
            strLine[index]);                    // storage destination and index iterator

        while (fInput.good())                       // while loop for open file
        {
            getline(                                // read line from data file
                fInput,                             // file handle to read
                strLine[index++]);              // storage destination
        }

        fInput.close();                             // close the file
        index = 0;                                  // resets back to start of string

        while (strLine[index] != "")                // while loop for string not void
        {
            size_t pReturnValue;                    // return code for mbstowcs_s

            mbstowcs_s(                             // converts string to TCHAR
                &pReturnValue,                      // return value
                szOutput,                           // destination of the TCHAR
                50,                                 // size of the destination TCHAR
                strLine[index].c_str(),             // source of string as char
                50);                                // max # of chars to copy

            SendMessage(                            // message to a control
                hWnd_ListBox,                       // handle to listbox
                LB_ADDSTRING,                       // append string to listbox
                NULL,                               // window parameter not used
                LPARAM(szOutput));                  // TCHAR to add

            index++;                                // next element of string array
        }
        return true;                                // file loaded okay 
    }
    return false;                                   // file did not load okay
}

Eu sei que a matriz strLine [201] da string terá que mudar para uma matriz strLine [101] [2] da string nas minhas declarações. No loop while (fInput.good ()), o strLine [index ++] precisa mudar para um loop for de alguma forma para percorrer todos os elementos da matriz. Não tenho certeza de como incluir a sintaxe para isso

Não relacionado: while (fInput.good())testes de validade ANTES de executar a leitura, permitindo que a leitura falhe sem ser detectada. Isso leva o programa a, entre outras coisas, precisar de um conjunto de 201 elementos para armazenar um arquivo de 200 itens. Consulte Por que o iostream :: eof dentro de uma condição de loop é considerado errado? para um problema semelhante
user4581301 28/01

Respostas:


0

Passo 1

Transforme string strLine[201];para string place[100][2];. Considere também fazer uma

struct place
{
    std::string state;
    std::string city;
};

porque é um pouco mais explícito o que exatamente está sendo armazenado. Um código mais expressivo é mais fácil de ler, geralmente evita erros (mais difícil de usar acidentalmente strLine[x][2]ou algo assim) e requer menos comentários. Código que comenta a si mesmo deve ser um objetivo pessoal. O compilador não se importa, é claro, mas poucas pessoas são compiladoras.

Passo 2

Use duas indexvariáveis separadas . Nomeie o primeiro como algo num_entriesporque o que ele realmente está fazendo é contar o número de itens na matriz.

etapa 3

Leia duas linhas na matriz interna e teste o resultado das leituras. Se eles lerem com sucesso, aumente o index.

while (getline(fInput, place[num_entries][0]) && getline(fInput, place[num_entries][1]))
{
    num_entries++;
}

Etapa 4 (limpeza opcional)

O passo 2 se transforma while (strLine[index] != "")em enquanto(index < num_entries)

Substitua todos os 50s por uma constante. Dessa forma, você não pode alterar o valor e perder alguns 50s. E é mais fácil deduzir o significado de um bom identificador descritivo do que de um número bruto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.