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

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

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

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

09.09.2012, 16:07. Просмотров 2409. Ответов 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: определяет точку входа для консольного приложения. ...

32
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 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 );
1
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;
}
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
09.09.2012, 16:59 #4
4ININ, нет не правильно, поменяйте 17 строчку на
C++
1
CalcOfString ( fileName );
1
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 01:03  [ТС] #5
Спасибо, теперь осталось решить проблему с потерей символов, решив проверить как открывается мой файл для правильного подсчета, я увидел что идет вывод строки начиная с третьего символа, подозреваю проблему сдесь :
C++
1
2
fin.ignore(1,'\t');
fin.ignore(1,' ');
кстате! а как еще можно сообщить об игноре пробела?
0
alsav22
5426 / 4821 / 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;
}
1
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 10:03  [ТС] #7
Спасибо за совет, но всеже хочется решить проблему моим способом
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
10.09.2012, 12:28 #8
Тошкарик, указатель на массив это Т**.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 18:23 #9
Цитата Сообщение от 4ININ Посмотреть сообщение
Спасибо за совет, но всеже хочется решить проблему моим способом
Своим - это используя ignore()?

Добавлено через 18 минут
Цитата Сообщение от Герц Посмотреть сообщение
Тошкарик, указатель на массив это Т**.
Указатель на массив символов (строку) именно так: char *NameOfFile; Если так: char **NameOfFile; , то указатель на массив строк.
0
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 минут
Вопрос : а я пробелы правильно игнорю?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 21:40 #11
Код с которым работаете и файл как выглядит. И что значит: "пропадают символы"?
0
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 )
0
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 22:05  [ТС] #13
Цитата Сообщение от alsav22 Посмотреть сообщение
И что значит: "пропадают символы"?
смотрите вложеный файл
0
Миниатюры
Обращение к функции  
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.09.2012, 23:08 #14
Код никуда не годится. С исчезновением символов всё понятно. Первую строку считывает правильно, перходит к следующей, первые символы пропускает, остальные считывает и т.д. Метод вами выбран неверный.

Добавлено через 6 минут
fin.ignore(1,'\t'); Считывается и отбрасывается один, любой , символ.
1
4ININ
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 57
10.09.2012, 23:09  [ТС] #15
Ну сейчас я пытался через get(); реализовать, но попытки оказались неудачны
0
10.09.2012, 23:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2012, 23:09
Привет! Вот еще темы с ответами:

Обращение к контейнеру в 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;


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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