2015-09-06 2 views
2

Выход программы Должно быть:Чтение данных из файла в массив

Цифры: 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; 
} 

Это содержимое файла TenNumbers.rtf Читаю данные из:

101 
102 
103 
104 
105 
106 
107 
108 
109 
110 

UPDATE 1: Я попытался с помощью текстового файла, но результаты похожи.

Числа: 0 0 0 0 0 0 0 0 1573448712 32767

UPDATE 2: я нашел, где этот вопрос. После запуска if (inputFile.good()) я узнал, что файл не открывается.

+0

Проверьте состояние 'inputFile' после открытия и каждый' файл_ввода >> чисел [ count] ', чтобы убедиться в отсутствии ошибок при загрузке из файла. Также подумайте, что должно произойти, если файл содержит меньше чисел ARRAY_SIZE. Я также предлагаю использовать 'std :: array' или' std :: vector', которые выполняют больше проверок в хороших отладчиках. –

+0

Я действительно не знаю формат .rtf. Вы уверены, что сохраняет текст в формате, совместимом с ASCII? Если нет, это может быть проблемой. Быстрый взгляд на страницу вики предполагает, что он, по крайней мере, может содержать дополнительные символы форматирования. Попробуйте с обычным файлом .txt. –

+0

Я пробовал использовать txt-файл, но результаты схожи. 'Цифры: 0 0 0 0 0 0 0 0 0 1573448712 32767' –

ответ

2

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

// 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++)

1

Ваше имя файла имеет 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] << " "; 
} 

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

+0

быстрое примечание стороны: не используйте count как имя переменной, если вы не используете использование пространства имен std; – anon

1

ARRAY_SIZE - номер int s, который вы выделили в массиве; то есть максимальное число int s.

count - это фактическое количество int, считанных из файла. Таким образом, ваш конечный цикл должен идти до 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», но это не имеет значения.

0

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

Таким образом, в цикле чтения:

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

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

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