2015-03-03 7 views
1

У меня есть текстовый файл с именем in.txt, который имеет целое число в каждой строке. Первая строка содержит количество строк минус 1 (= число целых чисел). Я хочу прочитать эти целые числа в массиве. Так что я написал ниже программу:Чтение целого числа из файла в C++

#include <iostream> 
#include <fstream> 
int main(int argc, char * argv[]) 
{ 
    std::fstream myfile("in.txt"); 

    int number; 
    int counter=0; 
    myfile >> number; 
    int inputArray[number]; 

    for(counter=0;counter=number;counter++) 
    { 
     myfile>>inputArray[counter]; 
    } 

    for(counter=0;counter=number;counter++){ 
     printf("%i",inputArray[counter]); 
    } 
    return 0; 
} 

Q1: Когда я запускаю его, ничего не происходит! Появится черный экран и останется пустым. Что не так?

Q2: Если входной файл был действительно большим (содержит около 2^27 целых чисел), эта программа хорошая идея, или я должен сделать что-то еще?

ответ

4

Есть несколько вещей неправильно с вашим кодом:

Прежде всего, вы не проверить, если ваши операции ввода успеха. Сделайте что-нибудь наподобие

if (! (myfile >> number)) { 
     std::cerr << "Reading number failed!\n"; 
     return -1; 
} 

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

Далее, в C++ нет массивов с переменным размером, вместо этого используйте std::vector<int> inputArray(number);. Это будет инициализировать весь массив 0, которые могут стоить некоторое время, вы можете изменить свой код

std::vector<int> inputArray; 
inputArray.reserve(number); 
for(int64_t counter=0;counter<number;counter++) 
{ 
    int temp; 
    myfile>>temp; 
    inputArray.push_back(temp); 
} 

, чтобы избежать этого.

Последнее, ваши условия цикла неправильные. Они должны быть

for(counter=0;counter<number;counter++) 

Если количество цифр может быть большим, вы должны использовать целое фиксированного размера, как int64_t для вас счетчиков и number вместо этого.

Это хорошая идея? Ну, это довольно эффективный способ чтения чисел, но чтение чисел 2^27 всегда будет занимать много времени. Если вы можете избежать этого, это ваша самая большая возможность ускорить процесс.

В качестве последнего замечания, вот как я бы написать операцию ввода с обработкой ошибок и все:

for (int temp; myFile >> temp;) 
    inputArray.push_back(temp); 

if(inputArray.size() != number) 
    std::cerr << "Number of numbers read did not match number in first line!\n"; 
+0

'нет массивов с переменным размером в C++': Я использовал переменную размерную массив в моей программе? Я заменил '=' '' 'символом для циклов, и программа теперь работает нормально. – Abraham

+0

@Abraham 'int inputArray [number];' является VLA, потому что 'number' не является константой времени компиляции. Вы можете сделать это с помощью 'g ++' и 'clang ++', потому что они поддерживают его как расширение, но это не стандартный C++. –

+0

В вашем тексте предложения хранятся ли целые числа в куче? Как насчет моей программы? – Abraham

2

Похоже, есть опечатка в этой строке:

for(counter=0;counter=number;counter++) 

Это должно быть:

for(counter=0; counter < number; counter++) 

У вас есть такая же ошибка в следующем цикле for.

+0

Это эффективный способ прочитать около 2^27 целых чисел из файла в массив? Я хочу сортировать целые числа с алгоритмом сортировки слиянием. Является ли это эффективным? Или я должен использовать другую процедуру? – Abraham

+1

Возможно, вы сможете немного ускорить процесс, прочитав весь текст в строке и используя 'istringstream'. –

+0

@RSahu: Я никогда не слышал, чтобы это было быстрее, я скорее думаю, что это будет значительно меньше. –

1
  1. 1.Вы должны создать динамический массив, чтобы иметь возможность выбирать его размер при выполнении программы
    1. Ошибка в логическом операторе
    2. Лучше поместить погоду в файл ввода или выходной файл при объявлении моего файла

попробовать это:

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

int main(int argc, char * argv[]) 
{ 
    std::fstream myfile("in.txt", ios::in | ios::out); 

    int number; 
    int counter = 0; 
    myfile >> number; 
    int *inputArray = new int[number]; 

    for (counter = 0; counter != number; counter++){ 
     myfile >> inputArray[counter]; 
    } 

    for (counter = 0; counter != number; counter++){ 
     printf("%i", inputArray[counter]); 
    } 
    delete[] inputArray; 
    return 0; 
} 

Я думаю, что бинарные файлы лучше для огромного количества данных.

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