2016-11-14 5 views
-3

Я хочу считать целые числа от .txt файл с именем "Пример в", который содержит (например):C++ - граф целых чисел из файла .txt

1 2 3 4 5 
3 6 7 
5 8 
8 9 10 11 

1. и возвращает мне 11, в этом случае (Целые числа, которые повторяются, считаются 1 - единственным числом номеров). На данный момент он выводит только 0 (я думаю, что на этом этапе проблема с открытием файла).

2. печатает только первые целые числа в каждой строке - 1, 3, 5, 8.

int integer_count(){ 
int count = 0; 
int i; 
ifstream fin; 
fin.open("Example.in"); //.txt file 

while(fin >> i) 
{ 
    count++; 
} 
fin.close(); 
return count; // In this case it should print 14 instead of 11, 
    because I didn't count out 3, 5 and 8 (which duplicates - haven't figured   
    out how to make unique count that would close eye for duplicates and 
    just count unique integers.) 
} 
+5

Пробовал ли вы использовать отладчик, чтобы узнать, что он на самом деле читает? –

+0

Вы можете попробовать вставить элемент, который вы читаете, в [set] (http://www.cplusplus.com/reference/set/set/), который представляет собой контейнер, в котором хранятся уникальные элементы по определенному заказу. Затем вы читаете размер набора. – BugsFree

+0

@ AlgirdasPreidžius Я новичок в этом. Я дважды проверял, но ничего не видел. Программные выходы - 0, что является начальным состоянием, что означает, что он, вероятно, даже не открыл файл, но - почему? – JasonM

ответ

0

При открытии файла, вы всегда должны проверить, имеет ли процесс открытия успеха , Я считаю, что file_name.good() - идеальная булева функция для этого. Просто сделать простой, если заявление, чтобы увидеть, если он работает, как и что:

if(fin.good()) std::cout << "File opened!"; 
else{ //do something when opening didn't work } 

Additioanlly, я полагаю, вы также должны написать «полное имя файла», который в этом случае (если имя файла является именно " Example.in ") будет" Example.in.txt ".

Для решения уникальных целых чисел есть пара решений: либо создайте std::vector, который хранит уже прочитанные целые числа из файла, и каждый раз, когда вы пытаетесь прочитать другой, проверьте, было ли оно уже прочитано (самый быстрый алгоритм здесь был бы быстрым/heap/merge sort + двоичный поиск, а не итерация каждый раз). Всегда, когда добавляется новое целое число, увеличивайте значение count на единицу.

Второе решение: просто сохранить целые числа в векторе и избавиться от кратных путем итерации и стирания. Тогда count будет только your_vector.size().

«Печать каждого целого числа, начинающего новую строку», представляет собой сложную проблему. Я бы переключился с while(fin >> i) на getline(). Таким образом, у меня есть каждая строка файла в виде строки, которая может быть преобразована в строку целых чисел. С вашим циклом while() вы не знаете, когда начинается новая строка, поэтому выполнить вторую задачу невозможно (или после задачи 1 вы можете снова открыть файл и использовать другой алгоритм только для получения первых целых чисел каждой строки)

Последнее: так много людей заявили, что использование отладчика настоятельно рекомендуется. Это избавило меня от размышлений о том, что не так, просто перейдя через код, построчно. Codeblocks предлагает действительно хороший отладчик, поэтому я рекомендую вам просто google руководство для отладчика кодовых блоков. Даже у YouTube есть некоторые учебные материалы, посвященные этому.

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