Чтение данных из файла в массив


Вывод программы должен быть:

Числа таковы:: 101 102 103 104 105 106 107 108 108 110

Но мой вывод таков:

Числа таковы:: 0 0 0 0 0 0 0 0 1606416272 32767

Вот мой код:

// This program reads data from a file into an array.

#include <iostream>
#include <fstream> // To use ifstream
using namespace std;

int main()
{
    const int ARRAY_SIZE = 10; // Array size
    int numbers[ARRAY_SIZE];   // Array number with 10 elements
    int count = 0;             // Loop counter variable
    ifstream inputFile;        // Input file stream object

    // Open the file.
    inputFile.open("TenNumbers.rtf");

    // Read the numbers from the file into the array.
    while (count < ARRAY_SIZE && inputFile >> numbers[count]){
        count++;
    }

    // Close the file.
    inputFile.close();

    // Display the numbers read:
    cout << "The numbers are: ";
    for (count = 0; count < ARRAY_SIZE; count++){
        cout << numbers[count] << " ";
    }

    cout << endl;

    return 0;
}

Таково содержание Теннумеров.rtf-файл, из которого я читаю данные:

101
102
103
104
105
106
107
108
109
110

Обновление 1: Я пробовал использовать txt файл, но результаты похожи.

Числа таковы:: 0 0 0 0 0 0 0 0 1573448712 32767

Обновление 2: Я нашел, в чем проблема. После запуска if (inputFile.good()) я обнаружил, что файл не открывается.

4 2

4 ответа:

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

// This program reads data from a file into an array.

#include <iostream>
#include <fstream> // To use ifstream
#include <vector>
using namespace std;

int main()
{
    std::vector<int> numbers;
    ifstream inputFile("c.txt");        // Input file stream object

    // Check if exists and then open the file.
    if (inputFile.good()) {
        // Push items into a vector
        int current_number = 0;
        while (inputFile >> current_number){
            numbers.push_back(current_number);
        }

        // Close the file.
        inputFile.close();

        // Display the numbers read:
        cout << "The numbers are: ";
        for (int count = 0; count < numbers.size(); count++){
            cout << numbers[count] << " ";
        }

        cout << endl;
    }else {
        cout << "Error!";
        _exit(0);
    }

    return 0;
}

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

Ваше имя файла имеет rtf в качестве суффикса. Содержит ли он в себе какую-либо информацию RTF?

Ошибка, которую я вижу в вашем коде, заключается в том, что вы предполагаете, что ARRAY_SIZE Число intS было успешно прочитано при печати чисел.

Использование:

// Display the numbers read:
cout << "Number of ints read: " << count << std::endl;
cout << "The numbers are: ";
for (int i = 0; i < count; i++){
    cout << numbers[i] << " ";
}

Это, скорее всего, выявит какие-либо проблемы при чтении данных.

ARRAY_SIZE это число ints, выделенных в массиве; то есть это максимальное число ints.

count - фактическое число интов, считанных из файла. Таким образом, ваш последний цикл должен доходить до count, так как это число фактических данных. Таким образом, цикл, который печатает ваши данные, должен быть:

int i;
for (i = 0; i < count; ++i)
    cout << numbers[count] << " ";

Или вы можете ходить по указателю:

int *start;

for (start = numbers; (numbers - start) < count; ++numbers)
    cout << *numbers << " ";

Кроме того, я думаю, что расширение файла должно быть "txt", а не "rtf", но это не имеет значения.

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

Итак, в цикле чтения:

// Read the numbers from the file into the array.
while (count < ARRAY_SIZE && inputFile >> numbers[count]){
    count++;
}

Входной поток inputFile по умолчанию пропускает пробелы, которые в вашем случае могут быть закодированы по-другому, тем самым пропущены или перепутаны каким-либо образом.

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