Получение нескольких входных файлов в C ++ и сохранение их в массиве - PullRequest
0 голосов
/ 29 апреля 2019

Я хочу получить ввод нескольких текстовых файлов, используя ifstream, и сохранить его в массиве char * или в векторе. У меня есть несколько тестовых файлов с именем test1.txt, test2.txt, test3.txt ... Поэтому я использовал цикл for и установил путь к файлу (строку) как «test» + to_string (i) + «.txt» Когда я получаю строку ввода из этого текстового файла, используя get line или >>, и печатаю ее для тестирования, текст правильно печатается внутри цикла for. Я сохранил строку в массиве, используя оператор как "Массив [I-1] = ул;"

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

Я пытался изменить массив на векторы, но он работает так же. Если я не использую цикл for и не устанавливаю каждую переменную filePath и string, это работает нормально, но я не думаю, что это хороший способ сделать это более чем в 10 случаях.

int main() { 
 char* array[10];
 char str[100]; //it is for the sample cases I randomly made which does  not exceeds 99 chars 

 for(int i=1; i<10; i++){
        string filePath = "Test" + to_string(i) + ".txt";
        ifstream openFile(filePath.data());
        if(openFile.is_open()){
           openFile >> str;
           array[i-1] = str;
           cout << array[i-1] << endl; 
           openFile.close();
        } 
}

cout << array[0] << endl;
cout << array[5] << endl;
cout << array[6] << endl;
//then if I print it here the outputs are all same: string from Test10.
}

например, если test1.txt = "a", test2.txt = "b" ... test9.txt = "i", test10.txt = "j"

внутри цикла for оно напечатано правильно => a b c d ... j. но вне цикла for вывод всего j.

1 Ответ

3 голосов
/ 29 апреля 2019

Вы делаете все указатели array, указывающие на то же самое место: первый символ str.

Существует несколько способов решения этой проблемы:

  • Сделать array массивом массивов, которые вы читаете непосредственно в
  • Динамически распределять новую память для каждой прочитанной строки и копировать в нее строку
  • Несколько других ...
  • Или решение, которое я рекомендую: используйте std::array (или, возможно, std::vector) из std::string и считывайте непосредственно в строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...