Проблема с чтением чисел из файла и их сохранением в массиве C++

Цель моей программы - в конечном итоге прочитать файл, заполненный числами (выбранными пользователем), в массив и вывести минимальные и максимальные значения. Однако я не могу заставить свой код выводить правильное количество входных данных в файле, которое я хочу использовать в качестве размера моего массива.

Код, который у меня есть сейчас,

#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], чтобы показать минимальное и максимальное значение, но сначала я нужно знать, насколько большим сделать массив на основе входного файла.

Выложите, пожалуйста, содержимое файла, из которого вы читаете.

R Sahu 03.09.2018 04:55

наличие первого числа в файле определяет количество вещей, которые следует прочитать, обычно выполняется для ввода теста программы (например, соревнований или школьных заданий) и не является показателем для всех файлов

kmdreko 03.09.2018 04:55

Рассмотрим std::vector.

user2486888 03.09.2018 04:56

Я включил содержимое файла, который пытаюсь прочитать. Также @kmdreko, означает ли использование in_file >> count, что первая запись в файле должна быть количеством записей в этом файле? Если это так, то это что-то вроде while (! In_file.eof ()) со счетчиком в цикле, как правильно узнать, насколько большим сделать массив? Также нам прямо сказали использовать массивы.

Connor Hale 03.09.2018 05:05

да, вам придется читать до конца или до другого обозначения. также см. это для чтения потока, потому что у while(eof) есть проблемы

kmdreko 03.09.2018 05:15
in_file >> count; считывает число, которое идет в счет из файла. Итак, согласно вашей программе, первое число в файле должно быть счетчиком. Если вы собираетесь использовать массив, и если файл не равен счетчику, вам нужно прочитать файл дважды: один раз для подсчета записей перед созданием массива и один раз для чтения записей в массив.
Jerry Jeremiah 03.09.2018 05:32

Также не используйте eof в условии цикла: stackoverflow.com/questions/5431941/…

Jerry Jeremiah 03.09.2018 05:33

Вот пример использования массива: onlinegdb.com/rkl_SE5vQ

Jerry Jeremiah 03.09.2018 06:15

@JerryJeremiah Массивы имеют постоянный размер, и если вы собираетесь использовать std::vector, вы можете просто использовать push_back. Вам действительно не следует использовать VLA.

BessieTheCookie 03.09.2018 06:40

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

molbdnilo 03.09.2018 07:50

Он не говорит, что счет равен 12. Он говорит, что счет равен 1, а затем выводит единственное значение, которое вы читаете, 2.

molbdnilo 03.09.2018 07:51

@FeiXiang Я знаю это. Я предполагал, что из-за того, что он использовал массив, который ему не разрешалось использовать std :: vector - я думаю, что это смешно, но это очень типичный пример того, как они учат C++.

Jerry Jeremiah 04.09.2018 00:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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];
}

Другие вопросы по теме