2010-09-26 3 views
0

Я пытался читать в целых числах из файла некоторые операции и выводить их в другой файл. Когда я ввожу целые числа в массив и затем распечатываю результат поиска случайных чисел. Является ли это чем-то связанным с ifstream, которое я не понимаю, или я пропущу что-то очевидное?ifstream случайные целые числа?

#include<iostream> 
#include<fstream> 
using namespace std; 

int main(){ 
    int i=0, test[100]; 
    ifstream reader("in.txt"); 
    while(!reader.eof()){ 
     reader>>test[i]; 
     i++; 
    } 
    for(int x=0; test[x]!=-1; x++) 
     cout<<test[x]<<endl; 
    return 0; 
} 

in.txt образец:

1 4 3 2 9 8 18 22 0 
2 4 8 10 0 
7 5 11 13 1 3 0 
-1 

0 и -1 являются стражами для EOL и ВФ соответственно

Если есть более простой способ сделать это, я также хотел бы знайте это. Я довольно новичок в C++, и я ненавижу то, как массивы ведут себя и другие языки.

+0

Есть ли у вас использовать массивы гр? Можете ли вы использовать stl :: vector вместо этого? –

+0

@B Johnson. Нет. Мне нужно уметь читать их по очереди. – cdbitesky

+0

@ все я пошел с sstream для каждой строки getline, а затем обработал все данные. Векторы кажутся гораздо более полезными, чем массивы, спасибо всем за ответы. – cdbitesky

ответ

1
sizeof(test)/sizeof(test[0]) 

Это время компиляции вычисления: она всегда будет приводить к 100. Если вы хотите знать, сколько целые числа вы на самом деле читать, вам нужно следить, что самостоятельно (или использовать контейнер, который отслеживает это для вас, как std::vector).

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

// make sure to test the array bound and test that the extraction succeeded: 
while((i < 100) && (reader >> test[i])) 
{ 
    i++; 
} 

Вы можете проверить состояние потока, чтобы определить, закончился ли цикл из-за отказа экстракции или потому, что был достигнут EOF. Если это не так, то i должно быть 100, и вы заполнили массив.

Вы можете прочитать this article, чтобы узнать, почему это правильный способ сделать это.

0

Используйте вектор, а не массив.

vector<int> test

Есть ли на самом деле 0 и -1 в тексте файла? Я могу неправильно понять вас по этому поводу, но они не должны буквально находиться в текстовом файле.

Итак, попробуйте следующее:

#include<iostream> 
#include<fstream> 
#include<vector> 
using namespace std; 

int main(){ 
    int i=0, tmp; 
    vector<int> test; 
    ifstream reader("in.txt"); 
    while((i < 100) && (reader >> tmp)) 
    { 
     test.push_back(tmp); 
     i++; 
    } 
    for(int x=0; x < test.size(); x++) 
     cout<<test[x]<<endl; 
    return 0; 
} 

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

Редактировать добавил предложение от другого ответа

+1

Нет необходимости ограничивать 'i' до 100, если вы используете вектор. На самом деле вам даже не нужно «я». – Paul

1

Очевидный проще всего было бы использовать зЬй :: вектор:

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <numeric> 
#include <fstream> 
#include <iterator> 

int main() { 
    std::vector<int> test; 
    std::ifstream reader("in.txt"); 

    // read the data into the vector: 
    std::copy(std::istream_iterator<int>(reader), 
       std::istream_iterator<int>(), 
       std::back_inserter(test)); 

    // show the data in the vector: 
    std::copy(test.begin(), 
       test.end(), 
       std::ostream_iterator<int>(std::cout, "\t")); 

    // Just for fun, display the average of the numbers: 
    std::cout << "Mean = " 
       << std::accumulate(test.begin(), test.end(), 0)/test.size(); 

    return 0; 
} 
+0

Это не чтение последней строки файла. – cdbitesky

+0

@cdbitesky: Конечно. Я предполагаю, что вы смешали это с каким-то другим кодом, который * проскакивает *, имея дело с последней прочитанной строкой, потому что ваш исходный код (с 'while (! Reader.eof())), казалось, читал последнюю строку дважды. –

Смежные вопросы