2016-02-10 7 views
1

У меня есть код, написанный для получения данных из входного файла (это всего лишь столбец из них и нулей) и превратить это в число 32-разрядных чисел. Это отлично работает, когда я знаю, сколько чисел в моем исходном файле. Я пытаюсь изменить его так, чтобы он работал для другого входного файла, где я не знаю размер, и вот где у меня проблемы Мой входной файл рад. Я пробовал:Как найти размер входного файла

int x=0; 
while(!rad.eof()) { 
x++; 
} 
cout << x; 

, который ничего не возвращает,

while(!rad.eof()) { 
     rad >> x; 
     cout << x << endl; 
    } 

, которая возвращает много больших чисел, которые все же и

while(!rad.eof()) { 
     rad >> x; 
     cerr << x << endl; 
    } 

который возвращает множество нулей

Код, который работает, когда я знаю размер входного файла:

/*const int m=32,n=40000; //n isnt 40000, change it so that its the size of radioactivedata 
    int a[n]; // variable to hold each number as it is read from file 
    int i=0,j=0; //define variables 
    for (i=0 ; i<n ; i++) a[i]=0; 
    for (i=0 ; i<n ; i++); rad >> a[i]; //read numbers from rad into array with (>>) operator 

    unsigned long Num=0; 
    while(j<n){ 
     i = 0; //reinitialize i and Num 
     Num = 0; 
     while (i<m){ 
      Num = Num + (a[j])*pow(2.,i); 
      i++; 
      j++; 
      } 

     cout << j/m << "\t" << Num << endl; 
     out << j/m << "\t" << Num << endl; 
}*/ 

Любая помощь будет оценена, пожалуйста, используйте простой язык.

+2

Поскольку вы используете C++, почему бы вам не использовать std :: vector вместо массива. таким образом вам не придется беспокоиться о том, сколько записей существует в вашем файле. – Devolus

+0

Я понятия не имею, как использовать std :: vector, у меня есть основная идея использования массивов. – Hester

ответ

0

Пожалуйста, посмотрите на руководство: http://www.cplusplus.com/reference/ios/ios/eof/

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

Вы можете переписать так:

std::ifstream is("example.txt"); // open file 

int cnt = 0; 
char c; 
while (is.get(c))     // loop getting single characters 
    cnt++; 

std::cout << "Character count in file: " << cnt; 

is.close(); 
+0

'close()' запускается на деструкторе 'std :: ifstream'. Выдержка из [cppreference] (http://en.cppreference.com/w/cpp/io/basic_ifstream/close): 'Эта функция [close()] вызывается деструктором basic_ifstream, когда объект потока выходит из области видимости и обычно не вызывается напрямую. ' – Patryk

+0

@Patryk Я не знал, спасибо. Пример в руководстве использует это явно по какой-либо причине. –

+0

уже прочитал эту страницу, это действительно помогает. Он просто возвращает 0 (или, по-видимому, независимо от того, что изначально я установил cnt равным, просто попробовал cnt = 5, и он вернулся 5 – Hester

2

Предполагая rad является std::ifstream вы можете использовать seekg() и tellg()

// std::ios_base::ate seeks to the end of the file on construction of ifstream 
    std::ifstream rad ("file.txt", std::ios_base::ate); 
    int length = 0; 
    if (rad) { 
    length = is.tellg(); 
    is.seekg (0, std::ios_base::beg); // reset it to beginning if you want to use it 
    } 
    // .. use length 
0

Нет необходимости беспокоиться о количестве значений в потоке. Просто скопируйте их в контейнер. Вы можете проверить размер контейнера, но это необязательно.

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

    // and in a function somewhere, assuming rad is a valid stream 

std::vector<int> data; 

std::copy(std::istream_iterator<int>(rad), 
      std::istream_iterator(), 
      std::back_inserter<std::vector<int> > (data)); 

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

+0

У меня есть пространство имен std; перед int main(), поэтому я не использую std :: before all (idk, это то, чему меня учили), как я могу сделать то, что вы сказали, без всякого std :: stuff? – Hester

+0

@Hester Вы можете просто удалить префикс 'std ::' при использовании 'using namespace std;'. –

+0

внутри экземпляра тоже? – Hester

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

  • Нет связанных вопросов^_^