Как прочитать числа из текстового файла и сохранить их в массив на C++?

Здравствуйте! У меня есть два файла, File_A и File_B, содержащие целые числа. Моя задача – объединить эти числа и записать их в отсортированном порядке в файл File_C. 

Я планирую считать числа в один общий массив, сначала загружая данные из файла A, затем из файла B. Однако у меня возникли трудности с тем, чтобы загрузить числа в массив. Я искал информацию в интернете, но не нашел подходящего решения. Поскольку изначально количество чисел неизвестно, я думаю, что лучше использовать вектор, но в качестве первого шага могу ограничиться массивом, например, на 20 элементов. 

Не могли бы вы помочь мне с кодом, который отвечает за считывание чисел из файлов и добавление их в массив? Буду очень признателен за помощь! На фотографии приложена визуализация моей программы. Спасибо!
  • 25 ноября 2024 г. 12:43
Ответы на вопрос 2
Здравствуйте!

Да, вы правы, если количество чисел неизвестно, лучше использовать `std::vector`, так как он может динамически изменять свой размер. Однако, если вы хотите сначала попробовать с фиксированным массивом, это тоже возможно. 

Вот пример кода на C++, который считывает числа из двух файлов, объединяет их и записывает в третий файл в отсортированном порядке. Я начну с реализации на основе фиксированного массива, как вы предложили:

```cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

void readNumbersFromFile(const std::string& filename, int* arr, int& count, int maxSize) {
    std::ifstream file(filename);
    if (!file) {
        std::cerr << "Error opening file: " << filename << std::endl;
        return;
    }
    while (count < maxSize && file >> arr[count]) {
        count++;
    }
    file.close();
}

int main() {
    const int maxSize = 20;
    int arr[maxSize * 2]; // Ожидаем, что у нас будет не более 40 чисел
    int count = 0;

    readNumbersFromFile("File_A.txt", arr, count, maxSize);
    readNumbersFromFile("File_B.txt", arr + count, count, maxSize);

    // Теперь у нас есть числа в массиве arr
    // Сортируем массив
    std::sort(arr, arr + count);

    // Записываем отсортированные числа в новый файл
    std::ofstream outputFile("File_C.txt");
    if (!outputFile) {
        std::cerr << "Error opening output file." << std::endl;
        return 1;
    }
    for (int i = 0; i < count; ++i) {
        outputFile << arr[i] << std::endl;
    }
    outputFile.close();

    std::cout << "Numbers have been read from File_A and File_B and written to File_C sorted." << std::endl;
    return 0;
}
```

### Объяснение кода:

1. **Чтение чисел из файла:**
   - Функция `readNumbersFromFile` отвечает за чтение целых чисел из файла. Она принимает название файла, массив, в который будут записываться числа, количество уже прочитанных чисел и максимальный размер массива.
   - В данной функции используется `ifstream` для открытия файла и чтения чисел до тех пор, пока не достигнут максимальный размер массива.

2. **Основная программа:**
   - В основном функции создается массив фиксированного размера, состоящий из 40 элементов (20 чисел из каждого файла).
   - Сначала считываются числа из `File_A`, затем из `File_B` (дописываются в массив).
   - Далее массив сортируется с использованием функции `std::sort`.
   - Отсортированные числа записываются в `File_C`.

### Использование векторов

Если вы хотите использовать векторы (что рекомендуется, если количество чисел может быть больше 40), вы можете изменить код следующим образом:

```cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

void readNumbersFromFile(const std::string& filename, std::vector<int>& numbers) {
    std::ifstream file(filename);
    if (!file) {
        std::cerr << "Error opening file: " << filename << std::endl;
        return;
    }
    int number;
    while (file >> number) {
        numbers.push_back(number);
    }
    file.close();
}

int main() {
    std::vector<int> numbers;

    readNumbersFromFile("File_A.txt", numbers);
    readNumbersFromFile("File_B.txt", numbers);

    std::sort(numbers.begin(), numbers.end());

    std::ofstream outputFile("File_C.txt");
    if (!outputFile) {
        std::cerr << "Error opening output file." << std::endl;
        return 1;
    }
    for (const int& number : numbers) {
        outputFile << number << std::endl;
    }
    outputFile.close();

    std::cout << "Numbers have been read from File_A and File_B and written to File_C sorted." << std::endl;
    return 0;
}
```

В этом варианте мы используем `std::vector` для хранения чисел, что позволяет избежать проблем с фиксированным размером массива и делает ваш код более гибким. 

Надеюсь, это поможет вам выполнить вашу задачу! Если у вас есть дополнительные вопросы, не стесняйтесь обращаться.
Вы правильно начали, заведите vector и делайте туда push_back. 

Читайте циклом while, пока чтение не вернет ошибку:
int x;
ifstream f("file.txt");
while (f >> x) {
  v.push_back(x);
}
Похожие вопросы