Я пытаюсь загрузить все файлы в папку с именами из формы «file_i.csv».
Для этого пишу программу:
void load_reel_set()
{
bool file_exists = true;
unsigned n_files = 0;
vector<unsigned> my_vector;
string line;
int i;
ifstream file("..\\file_" + to_string(n_files) + ".csv");
file_exists = file.good();
while (file_exists) {
//Load reel strips from file:
my_vector.clear();
getline(file, line, '\n');
save_line(my_vector, line);
all_my_vectors.push_back(my_vector);
file.close();
n_files++;
ifstream file("..\\file_" + to_string(n_files) + ".csv");
file_exists = file.good();
}
}
Функция «save_line» превращает символ в беззнаковое место за местом и сохраняет его в векторе.
У меня в папке четыре файла, в каждом всего одна строка. Эта функция распознает все мои файлы, но после первого строки для файлов пусты. Вектор all_my_vectors имеет ожидаемое значение в первом цикле, но равен 0 для следующих.
Спасибо в пользу.
Я вижу, это похоже на ошибку. Второй file
скрывает первый, проверяет, читается ли новый файл, а затем выходит за рамки. getline(file, line, '\n');
всегда вызывается с первой file
переменной, которая уже была прочитана до конца.
См. Переменное затенение и обратите внимание на пример в части С++. Вы сделали это по ошибке с вашей переменной file
.
У вас есть два экземпляра независимыйifstream file
, один внутри цикла скрывает другой снаружи. В то время как внутренний выходит за рамки после закрытия цикла, внешний остается в конце самого первого файла.
Вместо этого попробуйте:
file.open("the new path");
Примечание: эта переменная file_exists
полностью устарела, вы можете просто проверить ее напрямую while(file.good())
.
На самом деле вы можете избежать дублирования кода:
// other variables...
for(unsigned int n_files = 0;; ++n_files)
{
std::ifstream file("path to next file");
if (!file)
{
break;
}
// now file content handling here
}
Обратите внимание, что теперь std::ifstream
снова вернулся в цикл, но больше нет скрытого внешнего экземпляра.
Почему вы поддерживаете две одновременные переменные
ifstream file
? Чего добивается второй?