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):
- Alabama
- Brighton
- Arkansas
- Bermudas
- Averton
- 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):
- Alabama | Brighton
- Arkansas | Bermudas
- 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
}
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 semelhanteRespostas:
Passo 1
Transforme
string strLine[201];
parastring place[100][2];
. Considere também fazer umaporque é 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
index
variáveis separadas . Nomeie o primeiro como algonum_entries
porque 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
.Etapa 4 (limpeza opcional)
O passo 2 se transforma
while (strLine[index] != "")
em enquanto(index < num_entries)
Substitua todos os
50
s por uma constante. Dessa forma, você não pode alterar o valor e perder alguns50
s. E é mais fácil deduzir o significado de um bom identificador descritivo do que de um número bruto.fonte