Цель моей программы - в конечном итоге прочитать файл, заполненный числами (выбранными пользователем), в массив и вывести минимальные и максимальные значения. Однако я не могу заставить свой код выводить правильное количество входных данных в файле, которое я хочу использовать в качестве размера моего массива.
Код, который у меня есть сейчас,
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
int main(){
string fileName;
int count(0);
cout << "Enter input file name: ";
cin >> fileName;
ifstream in_file;
in_file.open(fileName);
if (in_file.is_open()){
in_file >> count;
}
cout << "The number of entries is " << count;
int arrayNumbers[count];
for (int i = 0; i < count; ++i){
in_file >> arrayNumbers[i];
cout << arrayNumbers[i] << endl;
}
in_file.close();
}
У меня есть текстовый файл с именем tester.txt в том же каталоге, что и мой файл .cpp, но он имеет только 9 записей (1-9 в отдельных строках), но когда я указываю счетчик, он говорит, что счет равен 12. Я видел в других вопросах, подобных моему, использование
in_file >> count;
чтобы подсчитать, сколько чисел находится в файле, но я не понимаю, что это делает, так как это мое первое чтение из файла. В файле, который я пытаюсь прочитать, есть следующее:
1
2
3
4
5
6
7
8
9
Я не приступил ко второй части проблемы, поиску минимального и максимального значений, однако я просто собирался отсортировать массив, а затем отобразить arrayNumber [0] и arrayNumber [count-1], чтобы показать минимальное и максимальное значение, но сначала я нужно знать, насколько большим сделать массив на основе входного файла.
наличие первого числа в файле определяет количество вещей, которые следует прочитать, обычно выполняется для ввода теста программы (например, соревнований или школьных заданий) и не является показателем для всех файлов
Рассмотрим std::vector.
Я включил содержимое файла, который пытаюсь прочитать. Также @kmdreko, означает ли использование in_file >> count, что первая запись в файле должна быть количеством записей в этом файле? Если это так, то это что-то вроде while (! In_file.eof ()) со счетчиком в цикле, как правильно узнать, насколько большим сделать массив? Также нам прямо сказали использовать массивы.
да, вам придется читать до конца или до другого обозначения. также см. это для чтения потока, потому что у while(eof) есть проблемы
in_file >> count; считывает число, которое идет в счет из файла. Итак, согласно вашей программе, первое число в файле должно быть счетчиком. Если вы собираетесь использовать массив, и если файл не равен счетчику, вам нужно прочитать файл дважды: один раз для подсчета записей перед созданием массива и один раз для чтения записей в массив.
Также не используйте eof в условии цикла: stackoverflow.com/questions/5431941/…
Вот пример использования массива: onlinegdb.com/rkl_SE5vQ
@JerryJeremiah Массивы имеют постоянный размер, и если вы собираетесь использовать std::vector, вы можете просто использовать push_back. Вам действительно не следует использовать VLA.
Вы действительно нужно для чтения в массив? Вы можете решить эту проблему для произвольного количества входов, используя только три целых числа (без сортировки).
Он не говорит, что счет равен 12. Он говорит, что счет равен 1, а затем выводит единственное значение, которое вы читаете, 2.
@FeiXiang Я знаю это. Я предполагал, что из-за того, что он использовал массив, который ему не разрешалось использовать std :: vector - я думаю, что это смешно, но это очень типичный пример того, как они учат C++.





but I don't understand what this does
Он считывает первый номер вашего ifstream в count.
Для кода, который вы должны работать, как задумано, вам нужно добавить общее количество чисел в начало входного файла, чтобы ваш файл выглядел так.
9
1
2
3
4
5
6
7
8
9
спасибо за все советы, мне удалось заставить его работать как задумано. Я выложу свой код ниже.
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
string fileName;
int num, counter = 0;
int main(){
cout << "Enter input file name: ";
cin >> fileName;
ifstream in_file;
in_file.open(fileName);
while(in_file >> num){
counter = counter+1;
}
in_file.clear(); //clear the eof flag after reaching end of file
in_file.seekg (0, ios::beg); //go back to the start of the file to read
int arrayNumbers[counter];
for (int i = 0; i < counter; ++i){
in_file >> arrayNumbers[i];
}
in_file.close();
sort(arrayNumbers, arrayNumbers+counter);
cout << "Min: " << arrayNumbers[0] << endl
<< "Max: " << arrayNumbers[counter-1];
}
Выложите, пожалуйста, содержимое файла, из которого вы читаете.