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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
09.09.2012, 16:07     Обращение к функции #1
Здраствуйте!
Написал программу которая должна считать количество строчек в файле ( без пустых строчек ), пустыми строчками называются те которые содержат пробел, символ табуляции и непечатаемые символы.

Когда написал программу в функции 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.09.2012, 16:11     Обращение к функции #2
Цитата Сообщение от 4ININ Посмотреть сообщение
char NameOfFile
Что это? Вы передаете символ? Нужно передавать указатель на массив, а не единичный символ.
C++
1
char *NameOfFile
И что это за вызов функции?
Цитата Сообщение от 4ININ Посмотреть сообщение
unsigned long NumberOfline ( char fileName );
В main просто пишете
C++
1
NumberOfline( fileName );
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
09.09.2012, 16:42  [ТС]     Обращение к функции #3
Вроде правильно, спасибо за помощь!

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
#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[255] );
 
    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');
            fin.ignore(1,'\t');
            fin.ignore(1,'\n');
            fin.ignore(1,' ');
            ++numberOfLines;
        }    
    }
    else
     cout<< " File: " << fileName << " is missing "; 
 
    fin.close();
 
    return numberOfLines;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.09.2012, 16:59     Обращение к функции #4
4ININ, нет не правильно, поменяйте 17 строчку на
C++
1
CalcOfString ( fileName );
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 01:03  [ТС]     Обращение к функции #5
Спасибо, теперь осталось решить проблему с потерей символов, решив проверить как открывается мой файл для правильного подсчета, я увидел что идет вывод строки начиная с третьего символа, подозреваю проблему сдесь :
C++
1
2
fin.ignore(1,'\t');
fin.ignore(1,' ');
кстате! а как еще можно сообщить об игноре пробела?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 02:13     Обращение к функции #6
Зачем вам эти массивы char? Есть же класс string. Мой вариант :
Код
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
#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;
    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');
            
            if (!str.empty() && !isspace((unsigned char)*str.begin()))
                    ++numberOfLines;
        }    
    }
    else
        cout<< " File: " << NameOfFile << " is missing "; 
    
    fin.close();
 
    return numberOfLines;
}
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 10:03  [ТС]     Обращение к функции #7
Спасибо за совет, но всеже хочется решить проблему моим способом
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
10.09.2012, 12:28     Обращение к функции #8
Тошкарик, указатель на массив это Т**.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 18:23     Обращение к функции #9
Цитата Сообщение от 4ININ Посмотреть сообщение
Спасибо за совет, но всеже хочется решить проблему моим способом
Своим - это используя ignore()?

Добавлено через 18 минут
Цитата Сообщение от Герц Посмотреть сообщение
Тошкарик, указатель на массив это Т**.
Указатель на массив символов (строку) именно так: char *NameOfFile; Если так: char **NameOfFile; , то указатель на массив строк.
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 21:26  [ТС]     Обращение к функции #10
Своим - это используя ignore()? - да. Чтобы ее решить мне нужно знать как исправить проблему с "пропаданием" двух символов в второй и следующих строках. и ошибка даже знаю где :

C++
1
2
fin.ignore(1,'\t');
fin.ignore(1,' ');
Добавлено через 2 часа 38 минут
Вопрос : а я пробелы правильно игнорю?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 21:40     Обращение к функции #11
Код с которым работаете и файл как выглядит. И что значит: "пропадают символы"?
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 21:54  [ТС]     Обращение к функции #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
#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');
            fin.ignore(1,'\t');       
            fin.ignore(1,' '); 
            ++numberOfLines;
 
                       //специально для проверки выводимого текста ( в готовой проге етого не будет ): 
              //cout<<string<<endl;
        }    
    }
    else
     cout<< " File: " << fileName << " is missing "; 
 
    fin.close();
    cout<<" \n"<<numberOfLines<<" "<<endl;
    
    return numberOfLines;
}
файл? ну я открываю этот же код, только по другому назвал само имяфайла.срр

Добавлено через 3 минуты
при компиляции выдает 33, хотя всего "правильных" строчек 37 ( с коментариями ),
кстате строчку 43 я тоже удалю...
или в реальной рабочей проге 34 ( без коментов и строки 43 )
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 22:05  [ТС]     Обращение к функции #13
Цитата Сообщение от alsav22 Посмотреть сообщение
И что значит: "пропадают символы"?
смотрите вложеный файл
Миниатюры
Обращение к функции  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 23:08     Обращение к функции #14
Код никуда не годится. С исчезновением символов всё понятно. Первую строку считывает правильно, перходит к следующей, первые символы пропускает, остальные считывает и т.д. Метод вами выбран неверный.

Добавлено через 6 минут
fin.ignore(1,'\t'); Считывается и отбрасывается один, любой , символ.
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 23:09  [ТС]     Обращение к функции #15
Ну сейчас я пытался через get(); реализовать, но попытки оказались неудачны
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 23:16     Обращение к функции #16
Чтение идёт из буфера. Представьте, что там все строки этого файла расположены непрерывной цепочкой, и функции читают их по одному символу и обрабатывают. Так легче будет понять, что не так.
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 с конца
alsav22
5282 / 4801 / 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;
}
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 23:58  [ТС]     Обращение к функции #19
Если отобразить все символы, то можно увидеть что сначала в строке идут пробелы а потом символ перехода на новую строку, я конечно понимаю что програмисты таких глупостей ( для проверки работоспособности программы в файле) писать не будут, но всеже как исправить?
Вложения
Тип файла: docx Program01.docx (10.9 Кб, 2 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 00:00     Обращение к функции
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
11.09.2012, 00:00  [ТС]     Обращение к функции #20
*в строке :
C++
1
2
3
    fin.close();// здесь : 
    
    return numberOfLines;
Yandex
Объявления
11.09.2012, 00:00     Обращение к функции
Ответ Создать тему
Опции темы

Текущее время: 21:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru