Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 18

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

07.02.2014, 16:06. Показов 4945. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть внешняя функция записанная в моей библиотеке, в эту функцию передаются 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> >
Помогите пожалуйста разобраться. ( Я С++ только изучаю, и не знаю что такое классы и с чем их едят)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2014, 16:06
Ответы с готовыми решениями:

Программа для работы с файлом
Помогите, пожалуйста!!!!! 11. Дано файл чисел. Создать два новых файла, первый из которых содержит элементы исходного файла с нечетными...

Класс для работы с файлом.
Есть класс для сортировки файла по номеру телефона. void Job::sort() { for(;;) { ifstream fin; fin.open(filename,...

Программа для работы с файлом
Задача такая: Дан текстовый файл, в котором есть 30 наименований книг( с автором,годом издания). Нужно написать программу, что бы она ...

9
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
07.02.2014, 18:49
Димферон, массив обязателен? Могу предложить альтернативное решение:
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;
}
0
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 18
07.02.2014, 19:43  [ТС]
Тут фишка в том, что файл в котором считаются строки задан не явно, то есть пользователь сам задает путь к файлу (его имя).
Цитата Сообщение от Димферон Посмотреть сообщение
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 минут
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
07.02.2014, 20:10
Димферон, попробуйте так:
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;
}
Придётся подправить функцию. Хотя если используете мою, работать будет.
0
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 18
07.02.2014, 23:20  [ТС]
Цитата Сообщение от 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 секунд
Сейчас попробую...
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
08.02.2014, 00:22
Димферон, да без разницы.
Следующим образом работает:
Кликните здесь для просмотра всего текста
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;
}
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
08.02.2014, 00:25
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());
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
08.02.2014, 00:31
Цитата Сообщение от DU Посмотреть сообщение
ifstream умеет строки принимать
Пробовал. Покажите пример, если не затруднит.
1
 Аватар для Димферон
3 / 3 / 2
Регистрация: 06.02.2014
Сообщений: 18
08.02.2014, 01:14  [ТС]
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;
}


В коде я сделал комментарий там где ошибка...
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
08.02.2014, 02:55
Димферон
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.02.2014, 02:55
Помогаю со студенческими работами здесь

программа для работы с файлом.
подскажите, как написать программу которая будет удалять слова, начинающиеся и заканчивающиеся на одну и туже букву.

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

Адаптировать задачу для работы с файлом
Дали такое задание: написать функцию revpositn которая которая принмает два параметра str1,str2 типа string и возвращает позицию начала...

Makefile для работы с текстовым файлом
Здравствуйте! Столкнулся с такой проблемой! Пишу makefile для следующей задачи: Мне нужно найти часть файла (она может располагаться...

Класс для работы с текстовым файлом
Нужно написать класс, который открывал и закрывал бы txt файл. Это как бы подзадание - в самой программе нужно что-то из файла читать и...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru