Сохранить строки из файла, но массив все еще пуст?Цикл для размера массива - PullRequest
0 голосов
/ 14 марта 2019

В принципе, я не уверен, почему это происходит, но я действительно хочу выяснить это. Это была моя идея, и я пытаюсь заставить ее работать.

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

Но я хотел сделать это:

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

Вот код:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main() {


ifstream the_file;

int i, j, z;

string lineCount;

the_file.open("sentence.txt");

j = 0;

while(!the_file.eof())

{
    getline(the_file, lineCount);
    j++;
}

z = j;


string array[z];


for (i = 0; i < z; i++)  {

    getline(the_file, array[i]);                       // Array is empty
    cout <<  i << " " << array[i] << endl;
}

cout << z << endl;



return 0;

}

Итак, после получения этого числа я хочу сохранить элементы в массиве. В этой части я использовал цикл for, чтобы попытаться это сделать, и выполнял цикл (размер массива - 1) несколько раз, чтобы соответствовать каждому элементу, сохраняемому в одном индексе массива.

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

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

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

Вот вывод:

    /Users/macuser/CLionProjects/PA2supp/cmake-build-debug/PA2supp
0 
1 
2 
3 
4 
5

Process finished with exit code 0

Вот файл, который я хочу прочитать, это "remace.txt". Как я уже сказал, я хочу, чтобы каждая строка была элементом в моем массиве

This is just one sentence.
This is the second sentence.
This is the third sentence.
This is the fourth sentence.
Fifth sentence right here.

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

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

В показанном коде несколько ошибок.

string array[z];

Массивы переменной длины не являются стандартным C ++, здесь вы используете нестандартный C ++.Либо используйте new, чтобы создать массив переменного размера, либо используйте std::vector.

while(!the_file.eof())

Это распространенная ошибка .Ваш возможный счетчик строк будет неверным.Прочитайте эту ссылку для подробного объяснения, почему это приводит к неправильному количеству строк.

Затем в конце этого цикла while вы достигли конца файла.

Ивы все еще в конце файла, когда вы начинаете второй цикл.Ваш второй цикл, цикл for, начинается с файлового потока, все еще находящегося в конце файла, поэтому второй цикл ничего не будет читать.Весь файл был прочитан.На каждой итерации цикла for getline() ничего не будет читать, поскольку весь файл уже прочитан в первом цикле while.

Запомните золотое правило компьютерного программирования: компьютервсегда будет делать именно то, что вы говорите, а не то, что вы хотите.Здесь вы хотите, чтобы второй цикл считывал файл с самого начала, но вы не сказали своему компьютеру, что это именно то, что он должен делать.Вам нужно будет использовать seekg(), чтобы переместить поток ввода в начало файла, перед его повторным чтением, и, в качестве хорошей меры, clear() состояние файла (поскольку поток файла будетустановить биты конца файла и / или сбоя в результате достижения конца файла в первом цикле).

0 голосов
/ 14 марта 2019

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

...