Чтение данных из файла в массив
Вывод программы должен быть:
Числа таковы:: 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 ответа:
Привет я скомпилировал ваш код, с помощью .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
Числоint
S было успешно прочитано при печати чисел.Использование:
// 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
это числоint
s, выделенных в массиве; то есть это максимальное числоint
s.
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
по умолчанию пропускает пробелы, которые в вашем случае могут быть закодированы по-другому, тем самым пропущены или перепутаны каким-либо образом.Примечание: попробуйте добавить тестовую строку , которая выводит считанное число перед его сохранением в массиве.