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

Функция для работы с файлом - C++

Восстановить пароль Регистрация
 
Димферон
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 14
07.02.2014, 16:06     Функция для работы с файлом #1
У меня есть внешняя функция записанная в моей библиотеке, в эту функцию передаются 2 значения:
1 - это начало массива, в котором записано имя файла, 2 - длинна имени файла
моя задача посчитать количество строк в файле, проблема в том, что имя файла переданное переменной не распознается "ifstream", у меня возникает ситуация такая что имя файла в ifstream становится равно = 0
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
#include "stdafx.h"
#include <string>
#include <iostream> 
#include <iomanip>
#include <cstring>
#include <Windows.h>
#include "conio.h"
#include "stdlib.h"
#include <cstdlib>
#include <fstream>
#include <stdio.h>
#include "Lib01LaS.h"
using namespace std;
 
char Name_file_us[250] = "\0";
int SumLines(char filename[], int len)
{ 
    for (int i = 0; i < len; i++)
    {
        Name_file_us[i] = filename[i];
    }
    ifstream fin(Name_file_us);
    int SumStr = 0;
    char str[250]="\0";
    if(!fin.is_open())
    {       
        return -1;
    }
    while (!fin.eof())
    {
        fin.getline(str,250);
        size_t len_1 = strlen(str);
        while (len_1 != 0)
        {
            SumStr++;
        }
    }
    fin.close();
    return SumStr;
}
C++
1
2
3
4
-       fin {_Filebuffer={_Set_eback=0x00000000 <NULL> _Set_egptr=0x00000000 <NULL> _Pcvt=0x00000000 {...} ...} }   std::basic_ifstream<char,std::char_traits<char> >
+       std::basic_istream<char,std::char_traits<char> >    {_Chcount=0 }   std::basic_istream<char,std::char_traits<char> >
+       std::basic_ios<char,std::char_traits<char> >    {_Mystrbuf=0x0044fb08 {_Set_eback=0x00000000 <NULL> _Set_egptr=0x00000000 <NULL> _Pcvt=0x00000000 {...} ...} ...}   std::basic_ios<char,std::char_traits<char> >
+       _Filebuffer {_Set_eback=0x00000000 <NULL> _Set_egptr=0x00000000 <NULL> _Pcvt=0x00000000 {...} ...}  std::basic_filebuf<char,std::char_traits<char> >
Помогите пожалуйста разобраться. ( Я С++ только изучаю, и не знаю что такое классы и с чем их едят)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
07.02.2014, 18:49     Функция для работы с файлом #2
Димферон, массив обязателен? Могу предложить альтернативное решение:
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
#include <iostream>
#include <fstream>
using namespace std;
 
int SumLines(istream& file, int& lines)
{ 
    char cur = '\0';
    char last = '\0';
    lines = 0;
    while(file.get(cur))
    {
        if(cur == '\n' ||
          (cur == '\f' && last == '\r'))
            lines++;
    }
    if(lines > 0)
    {
        lines++;
        return lines;
    }
    else
        return lines;
}
 
int main()
{
    ifstream file("file.txt");
    int l;
    SumLines(file, l);
    
    cout << "Lines count: " << l << endl;
    
    system("pause");
    return 0;
}
Димферон
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 14
07.02.2014, 19:43  [ТС]     Функция для работы с файлом #3
Тут фишка в том, что файл в котором считаются строки задан не явно, то есть пользователь сам задает путь к файлу (его имя).
Цитата Сообщение от Димферон Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
if(!fin.is_open()) 
{ return -1; } 
while (!fin.eof()) 
{ 
   fin.getline(str,250);
    size_t len_1 = strlen(str); 
    while (len_1 != 0) 
   {
      SumStr++; 
   } 
} 
fin.close();
почему я сделал так? Проста мне точно нужно узнать есть ли вообще в строки символы (чтобы ее засчитать), поэтому я и использую strlen()

Добавлено через 9 минут
Меня в общем интересует только ошибка, из-за который у меня не передается в переменной имя файла, которое должно восприниматься ifstream`ом..

Добавлено через 7 минут
Вот вообще как выглядит программа:
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
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <cmath>
#include <iostream>
#include "conio.h"
#include "time.h"
#include <iomanip>
#include <ctype.h>
#include <string>
#include <cstring>
#include <Windows.h>
#include <fstream>
#include "Lib01LaS.h"
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    char CPP[250] = "\0";
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout<<"Введите название файла."<<endl;
    cout<<"Имя файла:";cin>>CPP;
    int len = strlen(CPP);
    CPP[len+1] = '\0';
    int summ_lines = SumLines(CPP, len);
    if (summ_lines == -1)
    {
        system("cls");
        cout<<"***Выбранного файла не существует!***"<<endl<<
            "Проверьте правельность введенного имени файла или пути к файлу."<<endl;
    }
        cout<<"В файле "<<summ_lines<<" строк."<<endl;  
    system("pause");
    return 0;
}
C++
1
2
3
4
//Lib01LaS.h : Расчет количества строк и символов в программе
#define const int max_len = 250;
int SumLines(char filename[], int len);
int SumSimvol(char* filename);
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
//Lib01LaS.cpp : определение функций
#include "stdafx.h"
#include <string>
#include <iostream> 
#include <iomanip>
#include <cstring>
#include <Windows.h>
#include "conio.h"
#include "stdlib.h"
#include <cstdlib>
#include <fstream>
#include <stdio.h>
#include "Lib01LaS.h"
using namespace std;
 
char Name_file_us[250] = "\0";
int SumLines(char filename[], int len)
{ 
    for (int i = 0; i < len; i++)
    {
        Name_file_us[i] = filename[i];
    }
    ifstream fin(Name_file_us, ios::in);
    int SumStr = 0;
    char str[250]="\0";
    if(!fin.is_open())
    {       
        return -1;
    }
    while (!fin.eof())
    {
        fin.getline(str,250);
        size_t len_1 = strlen(str);
        while (len_1 != 0)
        {
            SumStr++;
        }
    }
    fin.close();
    return SumStr;
}
Добавлено через 17 минут
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
07.02.2014, 20:10     Функция для работы с файлом #4
Димферон, попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    string s;
    getline(cin, s);
    int size = s.length();
    char* fName = new char[size];
    strcpy(fName, s.c_str());
    ifstream file(fName);
    int l;
    SumLines(file, l);
    
    cout << "Lines count: " << l << endl;
    
    delete [] fName;
    
    system("pause");
    return 0;
}
Придётся подправить функцию. Хотя если используете мою, работать будет.
Димферон
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 14
07.02.2014, 23:20  [ТС]     Функция для работы с файлом #5
Цитата Сообщение от GuGo1991 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    string s;
    getline(cin, s);
    int size = s.length();
    char* fName = new char[size];
    strcpy(fName, s.c_str());
    ifstream file(fName);
    int l;
    SumLines(file, l);
    
    cout << "Lines count: " << l << endl;
    
    delete [] fName;
    
    system("pause");
    return 0;
}
Я так понимаю лучше использовать SumLines(file,l) как функцию типа void, а не int?

Добавлено через 15 секунд
Сейчас попробую...
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
08.02.2014, 00:22     Функция для работы с файлом #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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int SumLines(istream& file, int& lines)
{ 
    char cur = '\0';
    char last = '\0';
    lines = 0;
    while(file.get(cur))
    {
        if(cur == '\n' ||
          (cur == '\f' && last == '\r'))
            lines++;
    }
    if(lines > 0)
    {
        lines++;
        return lines;
    }
    else
        return lines;
}
 
int main()
{
    string s;
    cout << "Enter file name: ";
    getline(cin, s); //Вводим название файла с расширением
    int size = s.length(); //Вычисляем размер строки (имени файла)
    char* fName = new char[size]; //Создаем массив char размером строки
    strcpy(fName, s.c_str()); //Конвертируем string в char
    ifstream file(fName);
    int l;
    SumLines(file, l);
    
    cout << "Lines count: " << l << endl;
    
    delete [] fName;
    
    system("pause");
    return 0;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.02.2014, 00:25     Функция для работы с файлом #7
C++
1
2
3
4
 int size = s.length(); //Вычисляем размер строки (имени файла)
 char* fName = new char[size]; //Создаем массив char размером строки
 strcpy(fName, s.c_str()); //Конвертируем string в char
 ifstream file(fName);
char* fName = new char[size + 1]; - не забываем о нуль символе в конце.
но это бред вообще. ifstream умеет строки принимать. но если очень хочется указатель, то
C++
1
 ifstream file(s.c_str());
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
08.02.2014, 00:31     Функция для работы с файлом #8
Цитата Сообщение от DU Посмотреть сообщение
ifstream умеет строки принимать
Пробовал. Покажите пример, если не затруднит.
Димферон
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 14
08.02.2014, 01:14  [ТС]     Функция для работы с файлом #9
DU, GuGo1991, я нашел в чем проблема моей программы
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <cmath>
#include <iostream>
#include "conio.h"
#include "time.h"
#include <iomanip>
#include <ctype.h>
#include <string>
#include <cstring>
#include <Windows.h>
#include <fstream>
#include "Lib01LaS.h"
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    char CPP[250] = "\0";
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout<<"Введите название файла."<<endl;
    cout<<"Имя файла:";cin>>CPP;
    int len = strlen(CPP);
    CPP[len+1] = '\0';
    int summ_lines = SumLines(CPP, len);
    if (summ_lines == -1)
    {
        system("cls");
        cout<<"***Выбранного файла не существует!***"<<endl<<
            "Проверьте правельность введенного имени файла или пути к файлу."<<endl;
    }
        cout<<"В файле "<<summ_lines<<" строк."<<endl;  
    system("pause");
    return 0;
}
-------------------------------
//Lib01LaS.h : Расчет количества строк и символов в программе
#define const int max_len = 250;
int SumLines(char filename[], int len);
int SumSimvol(char* filename);
-------------------------------
//Lib01LaS.cpp : определение функций
#include "stdafx.h"
#include <string>
#include <iostream> 
#include <iomanip>
#include <cstring>
#include <Windows.h>
#include "conio.h"
#include "stdlib.h"
#include <cstdlib>
#include <fstream>
#include <stdio.h>
#include "Lib01LaS.h"
using namespace std;
 
char Name_file_us[250] = "\0";
int SumLines(char filename[], int len)
{ 
    for (int i = 0; i < len; i++)
    {
        Name_file_us[i] = filename[i];
    }
    ifstream fin(Name_file_us, ios::in);
    int SumStr = 0;
    char str[250]="\0";
    if(!fin.is_open())
    {       
        return -1;
    }
    while (!fin.eof())
    {
        fin.getline(str,250);
        size_t len_1 = strlen(str);
        while (len_1 != 0)
        {
            SumStr++;
        }
    }
    fin.close();
    return SumStr;
}

Проблема лишь в том что у меня не переходит на следующую строку файла вот в этом кусочке, и получается она бесконечно долго гоняет первую строку
C++
1
2
3
4
5
6
7
8
9
while (!fin.eof())
    {
        fin.getline(str,250);
        size_t len_1 = strlen(str);
        while (len_1 != 0)
        {
            SumStr++;
        }
    }
Добавлено через 14 минут
GuGo1991, DU, спасибо за помощь, я нашел в чем червоточена зарыта, больше тупил, с 1 раза правильно написал и сглупил в конце функции... с себя ржу просто страшно...
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <cmath>
#include <iostream>
#include "conio.h"
#include "time.h"
#include <iomanip>
#include <ctype.h>
#include <string>
#include <cstring>
#include <Windows.h>
#include <fstream>
#include "Lib01LaS.h"
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    char CPP[250] = "\0";
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout<<"Введите название файла."<<endl;
    cout<<"Имя файла:";cin>>CPP;
    int len = strlen(CPP);
    CPP[len+1] = '\0';
    int summ_lines = SumLines(CPP, len);
    if (summ_lines == -1)
    {
        system("cls");
        cout<<"***Выбранного файла не существует!***"<<endl<<
            "Проверьте правельность введенного имени файла или пути к файлу."<<endl;
    }
        cout<<"В файле "<<summ_lines<<" строк."<<endl;  
    system("pause");
    return 0;
}
-------------------------------
//Lib01LaS.h : Расчет количества строк и символов в программе
#define const int max_len = 250;
int SumLines(char filename[], int len);
int SumSimvol(char* filename);
-------------------------------
//Lib01LaS.cpp : определение функций
#include "stdafx.h"
#include <string>
#include <iostream> 
#include <iomanip>
#include <cstring>
#include <Windows.h>
#include "conio.h"
#include "stdlib.h"
#include <cstdlib>
#include <fstream>
#include <stdio.h>
#include "Lib01LaS.h"
using namespace std;
 
char Name_file_us[250] = "\0";
int SumLines(char filename[], int len)
{ 
    for (int i = 0; i < len; i++)
    {
        Name_file_us[i] = filename[i];
    }
    ifstream fin(Name_file_us, ios::in);
    int SumStr = 0;
    char str[250]="\0";
    if(!fin.is_open())
    {       
        return -1;
    }
    while (!fin.eof())
    {
        fin.getline(str,250);
        size_t len_1 = strlen(str);
        if(len_1 != 0) // <--- вот тут дал маху, вместо if написал while и программа тупила
        {
            SumStr++;
        }
    }
    fin.close();
    return SumStr;
}


В коде я сделал комментарий там где ошибка...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 02:55     Функция для работы с файлом
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
08.02.2014, 02:55     Функция для работы с файлом #10
Димферон
Yandex
Объявления
08.02.2014, 02:55     Функция для работы с файлом
Ответ Создать тему
Опции темы

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