Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
#1

Обращение к функции - C++

09.09.2012, 16:07. Просмотров 2323. Ответов 32
Метки нет (Все метки)

Здраствуйте!
Написал программу которая должна считать количество строчек в файле ( без пустых строчек ), пустыми строчками называются те которые содержат пробел, символ табуляции и непечатаемые символы.

Когда написал программу в функции int main, программа запустилась и правильно посчитала количество
строчек, но когда я решил перенести решение основной задачи в функцию
unsigned long NumberOfLine ( char NameOfFile ), возникла проблема : при запуске программы мне предлагается ввести имя файла с расширением, после его ввода программа завершает свою работу!

Вопрос : что я зделал не так ? подозреваю ошибка в обращении с функцией

вот код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <fstream>
#include <clocale>
 
using namespace std;
 
 
unsigned long NumberOfLine ( char NameOfFile );
char fileName[255];
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    cout<<" Enter file name : ";
    cin>> fileName; 
    unsigned long NumberOfline ( char fileName ); // почему игнорит ету строчку ? как исправить ?
 
    return 0;
}
 
unsigned long NumberOfLine ( char NameOfFile )
{
    unsigned long numberOfLines = 0;
    char string[512];
 
    ifstream fin( fileName );
    if (fin)
    {
        while ( !fin.eof()  )
        {
            fin.getline(string ,513 , '\n');
                fin.ignore(1,'\t');
            fin.ignore(1,'\n');
            fin.ignore(1,' ');
            ++numberOfLines;
        } 
     
    }
    else
     cout<< " File: " << fileName << " is missing "; 
 
    fin.close();
 
    return numberOfLines;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 16:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к функции (C++):

Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции - C++
Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции. f=arctgx+ln^2 x^2 Нужно...

Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции - C++
здраствуйте знатаки!! помогите пожалуйсто решить задачу.Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2,...

Найти среднее арифметическое значений функции f(x) в точках a, b, (a+b)/2 используя обращение к функции - C++
А этой нету: 3.Найти среднее арифметическое значений функции f(x) в точках a, b, (a+b)/2 используя обращение к функции f=(x*sin⁡ π/4) /...

Найти среднее арифметическое значений заданной функции в указанных точках, используя обращение к функции - C++
Ребят, помогите пожалуйста! Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции. ...

Обращение к функции - C++
Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции. f=2^2x+sin^2(x)-tgx, a=0.8...

Обращение к функции в классе - C++
Здравствуйте! Хочу обратится к функции print в классе Data. Помогите // 11.cpp: определяет точку входа для консольного приложения. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 23:16 #16
Чтение идёт из буфера. Представьте, что там все строки этого файла расположены непрерывной цепочкой, и функции читают их по одному символу и обрабатывают. Так легче будет понять, что не так.
1
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 23:50  [ТС] #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <fstream>
#include <clocale>
 
using namespace std;
 
 
unsigned long CalcOfString ( char *NameOfFile );
char fileName[255];
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    cout<<" Enter file name : ";
    cin>> fileName; 
    CalcOfString ( fileName );
    return 0;
}
 
unsigned long CalcOfString ( char *NameOfFile )
{
    unsigned long numberOfLines = 0;
    char string[512];
 
    ifstream fin( fileName );
    if (fin)
    {
        while ( !fin.eof()  )
        {
            fin.getline(string ,513, '\n');
                        if ( fin.peek() == '\n' )
            {fin.ignore(1,'\n');    }
            if ( fin.peek() == '\t' )
            {fin.ignore(1,'\t');    } 
            if ( fin.peek() == ' ' )
                {fin.ignore(1,' ');}
            ++numberOfLines;
 
            cout<<string<<endl;
        }    
    }
    else
     cout<< " File: " << fileName << " is missing "; 
 
    fin.close();
    cout<<" \n"<<numberOfLines<<" "<<endl;
    
    return numberOfLines;
}
Добавлено через 4 минуты
Всеравно меня пугают наличие пробелов в некоторых местах, наверно ето можно допилить циклом-проверкой что и попытаюсь сделать

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <fstream>
#include <clocale>
 
using namespace std;
 
 
unsigned long CalcOfString ( char *NameOfFile );
char fileName[255];
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    cout<<" Enter file name : ";
    cin>> fileName; 
    CalcOfString ( fileName );
    return 0;
}
 
unsigned long CalcOfString ( char *NameOfFile )
{
    unsigned long numberOfLines = 0;
    char string[512];
 
    ifstream fin( fileName );
    if (fin)
    {
        while ( !fin.eof()  )
        {
            fin.getline(string ,513);
                        while ( fin.peek() == '\n' )
            {fin.ignore(1,'\n');    }
            while ( fin.peek() == '\t' )
            {fin.ignore(1,'\t');    } 
            while ( fin.peek() == ' ' )
                {fin.ignore(1,' ');}
            ++numberOfLines;
 
            cout<<string<<endl;
        }    
    }
    else
     cout<< " File: " << fileName << " is missing "; 
 
    fin.close();
    cout<<" \n"<<numberOfLines<<" "<<endl;
    
    return numberOfLines;
}
Добавлено через 10 минут
Почти! Но теперь вся проблема в одной строке! а именно с 3 с конца
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 23:57 #18
Я свой код исправил. Как оказалось, он у меня тоже криво работал.
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <clocale>
#include <cctype> // для isspace()
using namespace std;
 
unsigned long CalcOfString (string &NameOfFile);
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    
    string fileName = "main.cpp";
    //cout << " Enter file name : ";
    //cin >> fileName; 
    
    cout << CalcOfString (fileName) << endl;
 
    system("pause");
    return 0;
}
 
unsigned long CalcOfString (string &NameOfFile)
{
    unsigned long numberOfLines = 0;
    string str;
 
    ifstream fin(NameOfFile);
    if (fin.is_open())
    {
        while (!fin.eof())
        {
            getline(fin, str, '\n');
            int flag = 0;
            if (!str.empty())
                for ( auto i = str.begin(); i != str.end(); i++)
                {
                    if (isgraph((unsigned char)*i))
                        flag = 1;
                }
            
            if (flag) ++numberOfLines;
                
            cout << str << endl;
        }    
    }
    else
        cout<< " File: " << NameOfFile << " is missing "; 
    
    fin.close();
 
    return numberOfLines;
}
0
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 23:58  [ТС] #19
Если отобразить все символы, то можно увидеть что сначала в строке идут пробелы а потом символ перехода на новую строку, я конечно понимаю что програмисты таких глупостей ( для проверки работоспособности программы в файле) писать не будут, но всеже как исправить?
0
Вложения
Тип файла: docx Program01.docx (10.9 Кб, 2 просмотров)
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
11.09.2012, 00:00  [ТС] #20
*в строке :
C++
1
2
3
    fin.close();// здесь : 
    
    return numberOfLines;
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2012, 01:34 #21
Цитата Сообщение от 4ININ Посмотреть сообщение
Почти!
Код все строки считает.

Добавлено через 6 минут
Мне кажется, у вас подход неверный. Счётчик у вас сам по себе, а пропуск символов сам по себе. Логика должна быть такой: если в строке есть хотя бы один печатный символ, то увеличиваем счётчик. Через пропуски символов это не решить. Первую строку вы вообще не обрабатываете.

Добавлено через 1 час 12 минут
Такой вариант тоже работает:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <fstream>
#include <clocale>
 
using namespace std;
 
 
unsigned long CalcOfString ( char *NameOfFile );
char fileName[255] = "main.cpp";
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    //cout<<" Enter file name : ";
    //cin>> fileName; 
    CalcOfString ( fileName );
    system("pause");
    return 0;
}
 
unsigned long CalcOfString ( char *NameOfFile )
{
    unsigned long numberOfLines = 0;
    char string[512];
 
    ifstream fin( fileName );
    if (fin)
    {
        while ( !fin.eof()  )
        {
            char ch;
            int flag = 0;
            while ( (ch = fin.peek()) != EOF ) 
            {
                if (ch != ' ' && ch != '\t' && ch != '\n')  
                {
                        ++numberOfLines;
                        flag = 1;
                        fin.ignore(255, '\n');
                        break;
                }
                fin.ignore(1);
            }
            
            //fin.getline(string ,513);
            
            /*{fin.ignore(1,'\n');    }
            while ( fin.peek() == '\t' )
            {fin.ignore(1,'\t');    } 
            while ( fin.peek() == ' ' )
                {fin.ignore(1,' ');}
            ++numberOfLines;
 
            cout<<string<<endl;*/
        }    
    }
    else
     cout<< " File: " << fileName << " is missing "; 
 
    fin.close();
    cout<<" \n"<<numberOfLines<<" "<<endl;
    
    return numberOfLines;
}
0
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
11.09.2012, 19:01  [ТС] #22
Прикол! я такойже алгоритм создал, у меня даже строка
C++
1
if (ch != ' ' && ch != '\t' && ch != '\n')
была, но я реализовал ее через getline() а потом get(), в результате пошол от обратного и написал новый код ( который видели уже )

а зачем нужна переменная flag?
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2012, 19:36 #23
Цитата Сообщение от 4ININ Посмотреть сообщение
а зачем нужна переменная flag?
Забыл убрать. Сначала у меня ++numberOfLines; стояло после if и потому нужен был флаг, а потом перенёс, а флаг убрать забыл.
0
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
11.09.2012, 20:08  [ТС] #24
Подведём итог=)

Итак получается вышло 2 проги, с разными алгоритмами но с одинаковым результатом, одна прога использует метод "в лоб" а вторая идет методом "от обратного"
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2012, 20:13 #25
Цитата Сообщение от 4ININ Посмотреть сообщение
Итак получается вышло 2 проги, с разными алгоритмами но с одинаковым результатом, одна прога использует метод "в лоб" а вторая идет методом "от обратного"
Из каких постов проги? Если имеется ввиду два моих кода, то алгоритм там одинаковый: перебор символов в строке и, при встрече с печатным символом, счётчик непустых строк увеличивается. Реализация алгоритмов разная.
0
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
11.09.2012, 20:16  [ТС] #26
Твоя и моя ( последние варианты )
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2012, 20:22 #27
Цитата Сообщение от 4ININ Посмотреть сообщение
Твоя и моя ( последние варианты )
Последний вариант - это вот этот?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <fstream>
#include <clocale>
 
using namespace std;
 
 
unsigned long CalcOfString ( char *NameOfFile );
char fileName[255];
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    cout<<" Enter file name : ";
    cin>> fileName; 
    CalcOfString ( fileName );
    return 0;
}
 
unsigned long CalcOfString ( char *NameOfFile )
{
    unsigned long numberOfLines = 0;
    char string[512];
 
    ifstream fin( fileName );
    if (fin)
    {
        while ( !fin.eof()  )
        {
            fin.getline(string ,513);
                        while ( fin.peek() == '\n' )
            {fin.ignore(1,'\n');    }
            while ( fin.peek() == '\t' )
            {fin.ignore(1,'\t');    } 
            while ( fin.peek() == ' ' )
                {fin.ignore(1,' ');}
            ++numberOfLines;
 
            cout<<string<<endl;
        }    
    }
    else
     cout<< " File: " << fileName << " is missing "; 
 
    fin.close();
    cout<<" \n"<<numberOfLines<<" "<<endl;
    
    return numberOfLines;
}
0
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
11.09.2012, 20:27  [ТС] #28
получается да, но ее осталось допилить в проверке первой строки, и ты потерял
C++
1
#include <iostream>
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2012, 20:32 #29
Объяснить можете: в каком случае, в этом коде, происходит ++numberOfLines; ?
0
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
11.09.2012, 20:42  [ТС] #30
Идет построчный перебор строк
C++
1
fin.getline(string ,513);
Далее в силу вступают поочередно цыклы которые сначала просматривают символ
C++
1
fin.peek()
и если удалось удовлетворить одно из условий :
C++
1
2
3
== '\n'
== '\t'
== ' '
идет игнор одного из символов ( исходя из условия )
C++
1
2
3
{fin.ignore(1,'\t');}
{fin.ignore(1,'\n');}
{fin.ignore(1,' ');}
так как все "ненужные" символы убрались остались только строки с нужными символами, соответственно и идет их подсчет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 20:42
Привет! Вот еще темы с ответами:

Обращение к контейнеру в const функции - C++
Есть примерно такой код: class a { map&lt;int, map&lt;int, bool&gt;&gt; matrix; bool IsEdgeExists(int pointFrom, int pointTo) const { ...

Обращение к функции, из другого CPP - C++
допустим есть один проект, и лепить все в один файл не хочется.. можно ли в разные файлы в одном проекте написать функции.. чтобы в главном...

Обращение к статической функции класса - C++
Всем привет! есть Number.h: using namespace std; #pragma once class Number { public: Number(void);

Обращение к аргументу внутри функции - C++
void F(){ M=50; // тут пишет undefined symbol M. } void T(int *M){ F(); } int main{ int MASS;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.09.2012, 20:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru