Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/181: Рейтинг темы: голосов - 181, средняя оценка - 4.66
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
1

[C++] Работа с файлами

17.06.2010, 21:09. Показов 33245. Ответов 74
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: Есть файлы, которые надо обработать:
1.просканировать директории на наличие файлов расширения *.TXT
2.сохранять список путей к файлам в booklist.txt (для дальнейшей работы)
3.вывести booklist.txt на экран

Добавлено через 41 минуту
пытался найти похожие или хоть какие-то программы работы с файлами нашел вот эту

работает с файлами через аргумент и выводит дважды содержание файла:
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
// Заголовочные файлы для ввода-вывода
#include <iostream>
#include <fstream>
 
void printFileTwice (const char* filename)
{
    // Открытие файла
    std::ifstream file(filename);
 
    // Первый вывод содержимого
    std::cout << file.rdbuf();
 
    // Возврат к началу файла
    file.seekg(0);
 
    // Второй вывод содержимого
    std::cout << file.rdbuf();
}
 
int main (int argc, char* argv[])
{
    // Двукратный вывод всех файлов, переданных в командной строке
    for (int i=1; i<argc; ++i) {
        printFileTwice(argv[i]);
    }
}
Добавлено через 16 минут
------------------------------------

Посоветуйте что можно сделать, я в С++ только начал
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2010, 21:09
Ответы с готовыми решениями:

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

работа с файлами
Написать программу, которая выводит на экран содержимое текстового файла

Работа с файлами
К сожалению, не имею возможности обучаться методом проб и ошибок, потому оперирую теорией. FILE *...

Работа с файлами
Задача программы такова - пользователь вводит строку адреса , например C:\blablabla и программа...

74
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
21.06.2010, 10:12 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Egeni Посмотреть сообщение
но вызывает ошибку
Cannot convert 'void *' to 'char *'
C
1
char *ret=malloc(len), *ptr=ret;
=>
C
1
char *ret=(char *)malloc(len), *ptr=ret;
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
21.06.2010, 20:35  [ТС] 42
Хотел написать программу удаления коментариев в С++ исходных файлах.
построчных // коментарий
многострочных /* коментарий */

у меня тоже возник вопрос какие есть функции для работы со строками?
как вообще лучше работать с файлом какие типы (char я так понимаю) при этом используются?

я впринципе представляю себе алгоритм:

1.открыть файл
в аргументах для функции передавать
1-имя файла, 2-строку которую изменить (// и /*), 3-строку на что изменить(если пусто тоесть удалить)

2.прочитать его в переменную
(как лучше читать по строчно или нет? если большой файл то как быть?)

3.найти в файле совпадения
функция поиска по файлу при нахождении 2строки (// и /*) искать конец (endline или */) и возвращать номера символов первого найденного и последнего (/* */) и после удалить их
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
21.06.2010, 23:05 43
Файл лучше обрабатывать посимвольно
Evg же довольно подробно описал алгоритм https://www.cyberforum.ru/post165944.html

Добавлено через 1 час 29 минут
На ночь глядя мой воспаленный мозг родил такой код Он не безупречен.
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.h>
#include <fstream.h>
 
int main(int argc, char* argv[])
{
   int buf1 = 0, buf2 = 0;
   int f_c = 0, f_cplus = 0, f_com;
   ifstream file_in;
   ofstream file_out;
 
   file_in.open("d:\\progexp\\com.cpp");
   if (!file_in.is_open())
   {
      cerr << "Can not open input file" << endl;
      system("pause");
      return 1;
   }
   file_out.open("d:\\progexp\\nocom.cpp");
   if (!file_out.is_open())
   {
      cerr << "Can not open output file" << endl;
      system("pause");
      return 1;
   }
 
   while ((buf1 = file_in.get()) != EOF)
   {
      if (buf1 == '/' && f_c == f_cplus)
      {
         f_com = 1;
      }
      if (buf2 == '/' && buf1 != '/' && buf1 != '*' && f_c == f_cplus)
      {
         f_com = 0;
         file_out.put(buf2);
      }
      if (buf1 == '/' && buf2 == '/' && f_c != 1)
         f_cplus = 1;
      if (buf1 == '*' && buf2 == '/' && f_cplus != 1)
         f_c = 1;
      if (buf1 == '\n' &&f_cplus == 1)
         f_cplus = f_com = 0;
      if (buf1 == '/' && buf2 == '*' && f_c == 1)
      {
         f_c = f_com = 0;
         continue;
      }
      if (!f_com)
         file_out.put(buf1);
      buf2 = buf1;
   }
   file_in.clear();
   file_out.close();
   return 0;
}
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 00:03  [ТС] 44
Хочешь разобраться в коде - попробуй его откоментируй. пробовал откоментировать до цепочки if условий дальше немного не понятно что в себе хранят переменные f_c, f_cplus, f_com

Цитата Сообщение от kazak Посмотреть сообщение
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
#include <iostream.h>
#include <fstream.h>
 
int main(int argc, char* argv[]){
   int buf1 = 0, buf2 = 0;
   int f_c = 0, f_cplus = 0, f_com;
   ifstream file_in;
   ofstream file_out;
   //Файл открытия
   file_in.open("com.cpp");
   //Если не получилось открыть файл
   if (!file_in.is_open())   {
      cerr << "Can not open input file" << endl;
      system("pause");
      return 1;   }
   //Файл вывода
   file_out.open("nocom.cpp");
   if (!file_out.is_open())   {
      cerr << "Can not open output file" << endl;
      system("pause");
      return 1;   }
      /*Условие проверки
      * записываем в buf1 входящий файл
      */
   while ((buf1 = file_in.get()) != EOF)   {
      //Если buf1 равен "/" и f_c равен f_cplus, то f_com равняется 1
      if (buf1 == '/' && f_c == f_cplus)      {
         f_com = 1;
      }
      //Если buf2 = "/" и buf1 не "/" и buf1 не "*" и  f_c = f_cplus
      if (buf2 == '/' && buf1 != '/' && buf1 != '*' && f_c == f_cplus)       {
         f_com = 0;
         file_out.put(buf2);
      }
      if (buf1 == '/' && buf2 == '/' && f_c != 1)
         f_cplus = 1;
      if (buf1 == '*' && buf2 == '/' && f_cplus != 1)
         f_c = 1;
      if (buf1 == '\n' &&f_cplus == 1)
         f_cplus = f_com = 0;
      if (buf1 == '/' && buf2 == '*' && f_c == 1)
      {
         f_c = f_com = 0;
         continue;
      }
      if (!f_com)
         file_out.put(buf1);
      buf2 = buf1;
   }
   file_in.clear();
   file_out.close();
   return 0;
}
непонятно с какими аргументами можно работать, тоесть что передается аргументами??
а так впринципе код работает на отлично, но оставляет дыры на многострочных коментариях в файле nocom.cpp
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
22.06.2010, 00:08 45
f_c, f_cplus, f_com это флаги
f_com - флаг комментария
f_c - флак комментария в стиле Си
f_cplus - флаг комментария в стиле С++
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 12:18  [ТС] 46
а можно ли при этом использовать switch-case и строки или массив?
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
22.06.2010, 12:22 47
Если придумаешь как, почему бы и нет.)
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 12:32  [ТС] 48
Попробовал скомпилированной программой обработать тот же исходник отрезало пол файла заголовков... почему?

как можно изменить программу чтобы она реагировала на звездочку как на много символов после start /* и */ до end соотвественно, а то с флагами немного не понятно.
Вложения
Тип файла: rar test.rar (660 байт, 20 просмотров)
Тип файла: rar build22.06.2010.rar (675 байт, 20 просмотров)
0
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 12:50  [ТС] 49
Я кажется догадываюсь... оно читает заголовки cpp и пытается их выполнить
Программу понял так: если встречается в буфере коментарии то оно возвращает 0 до тех пор пока не встречает конец коментариев.

а как бы сделать так чтобы оно не возвращало при удалении несколько строчек многострочного коментария а пропускало до конца? для этого надо читать файл и если встречается коментарий- возвращать позицию начала коментария и пропускать до тех пор пока не встретиться позиция конечного?
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
22.06.2010, 13:01 50
Цитата Сообщение от Egeni Посмотреть сообщение
Попробовал скомпилированной программой обработать тот же исходник отрезало пол файла заголовков... почему?
Я при объявлении флагов забыл проинициализировать один флаг.
Цитата Сообщение от kazak Посмотреть сообщение
int f_c = 0, f_cplus = 0, f_com;
C++
1
int f_c = 0, f_cplus = 0, f_com = 0;
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 13:13  [ТС] 51
да действительно, заменил все вышло.
как можно изменить программу чтобы программа реагировала на звездочку как на много символов после start /* и */ до end соотвественно, а то с флагами выходит много условных цепочек
нашел функцию erase которая удаляет из строк
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<string>
using namespace std;
 
int main(){
    string st;
    cout<<"Enter string: "<<endl;
    getline(cin, st);
    cout<<"\nYour enter string:"<<endl;
    cout<<st<<endl;
 
    st.erase(5, 2);
 
    cout<<st<<endl;
    system("pause");
    return 0;
}
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
22.06.2010, 13:55 52
Цитата Сообщение от Egeni Посмотреть сообщение
реагировала на звездочку как на много символов после start /* и */ до end соотвественно
Не совсем понял.
Вот вариант со строками, получился еще больше, но если комментарий в отдельной строке, пропускает всю строку.
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
#include <iostream.h>
#include <fstream.h>
 
int main(int argc, char* argv[]){
   char buf[257] = {'\0'};
   char *tmp;
   int f_c = 0;
   ifstream file_in;
   ofstream file_out;
 
   file_in.open("d:\\progexp\\build22.06.2010.cpp");
   if (!file_in.is_open())
   {
      cerr << "Can not open input file" << endl;
      system("pause");
      return 1;
   }
   file_out.open("d:\\progexp\\nocom.cpp");
   if (!file_out.is_open())
   {
      cerr << "Can not open output file" << endl;
      system("pause");
      return 1;
   }
 
   while (file_in.good())
   {
      file_in.getline(buf, 256);
      if (!f_c)
      {
         if ((tmp = strstr(buf, "//")) != NULL)
         {
            *tmp = '\0';
            for (int i = 0; i < strlen(buf); i++)
            {
               if (buf[i] != ' ' && buf[i] != '\t')
               {
                  file_out << buf << endl;
                  break;
               }
            }
            continue;
         }
         else if ((tmp = strstr(buf, "/*")) != NULL)
         {
            *tmp = '\0';
            f_c = 1;
            for (int i = 0; i < strlen(buf); i++)
            {
               if (buf[i] != ' ' && buf[i] != '\t')
               {
                  file_out << buf << endl;
                  break;
               }
            }
            continue;
         }
         else
            file_out << buf << endl;
      }
      else
      {
         if ((tmp = strstr(buf, "*/")) != NULL)
         {
            f_c = 0;
         }
      }
   }
   file_out.close();
   return 0;
}
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 20:23  [ТС] 53
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
#include <iostream.h>
#include <fstream.h>
 
 
void textor(DelStart, DelStop, file_in, file_out ){ 
   char buf[32769] = {'\0'};
   char *tmp;
 
   int f_c = 0;
   ifstream file_in;
   ofstream file_out;
 
   file_in.open(file_in);
   if (!file_in.is_open())
   {
      cerr << "Can not open input file" << endl;
      system("pause");
      return 1;
   }
   file_out.open(file_out);
   if (!file_out.is_open())
   {
      cerr << "Can not open output file" << endl;
      system("pause");
      return 1;
   }
     
   while (file_in.good())
   {
      file_in.getline(buf, 32768);
      if (!f_c)
      {
        if ((tmp = strstr(buf, DelStart)) != NULL)
         {
            *tmp = '\0';
            f_c = 1;
            for (int i = 0; i < strlen(buf); i++)
            {
               if (buf[i] != ' ' && buf[i] != '\t')
               {
                  file_out << buf << endl;
                  break;
               }
            }
            continue;
         }
         else
            file_out << buf << endl;
      }
      else
      {
         if ((tmp = strstr(buf, DelStop)) != NULL)
         {
            f_c = 0;
         }
      }
   }
   file_out.close();
   return file_out;
}
 
 
int main(int argc, char* argv[]){
    char *DelStart = "/*";
    char *DelStop = "*/";
    char *file_in = "test.cpp";
    char *file_out = "testnocom.cpp.txt";
    textor("/*","*/","test.cpp","testnocom.cpp.txt");
}
Хотел собрать функцию в функцию удаление многострочных коментариев выкинуло ошибку о том что нельзя использовать это как функцию.. ошибки с типами
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
22.06.2010, 21:18 54
Цитата Сообщение от Egeni Посмотреть сообщение
void textor(DelStart, DelStop, file_in, file_out )
Где типы аргументов?
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 21:37  [ТС] 55
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
#include <iostream.h>
#include <fstream.h>
 
    char *DelStart = "/*";
    char *DelStop = "*/";
    char *file_in = "test.cpp";
    char *file_out = "testnocom.cpp.txt";
    
void textor(DelStart, DelStop, file_in, file_out){ 
   char buf[32769] = {'\0'};
   char *tmp;
 
   int f_c = 0;
   ifstream file_in;
   ofstream file_out;
 
   file_in.open(file_in);
   if (!file_in.is_open())
   {
      cerr << "Can not open input file" << endl;
      system("pause");
      return 1;
   }
   file_out.open(file_out);
   if (!file_out.is_open())
   {
      cerr << "Can not open output file" << endl;
      system("pause");
      return 1;
   }
     
   while (file_in.good())
   {
      file_in.getline(buf, 32768);
      if (!f_c)
      {
        if ((tmp = strstr(buf, DelStart)) != NULL)
         {
            *tmp = '\0';
            f_c = 1;
            for (int i = 0; i < strlen(buf); i++)
            {
               if (buf[i] != ' ' && buf[i] != '\t')
               {
                  file_out << buf << endl;
                  break;
               }
            }
            continue;
         }
         else
            file_out << buf << endl;
      }
      else
      {
         if ((tmp = strstr(buf, DelStop)) != NULL)
         {
            f_c = 0;
         }
      }
   }
   file_out.close();
   return buf;
}
 
 
int main(int argc, char* argv[]){
    char *DelStart = "/*";
    char *DelStop = "*/";
    char *file_in = "test.cpp";
    char *file_out = "testnocom.cpp.txt";
    textor("/*","*/","test.cpp","testnocom.cpp.txt");
}
Код
9: error: variable or field `textor' declared void
9: error: initializer expression list treated as compound expression
9: error: invalid conversion from `char*' to `int'
9: error: expected `,' or `;' before '{' token
In function `int main(int, char**)':
72: error: `textor' cannot be used as a function
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
22.06.2010, 21:40 56
Цитата Сообщение от Egeni Посмотреть сообщение
void textor(DelStart, DelStop, file_in, file_out)
я это имел в виду
C++
1
void textor(char *DelStart, char *DelStop, char *file_in, char *file_out)
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 21:49  [ТС] 57
Код
In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31,
                 from E:\build22.06.2010_2034_func.cpp:1:
C:/Dev-Cpp/include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
E:\build22.06.2010_2034_func.cpp: In function `void textor(char*, char*, char*, char*)':
E:\build22.06.2010_2034_func.cpp:14: error: declaration of 'std::ifstream file_in' shadows a parameter
E:\build22.06.2010_2034_func.cpp:15: error: declaration of 'std::ofstream file_out' shadows a parameter
E:\build22.06.2010_2034_func.cpp:17: error: invalid conversion from `void*' to `const char*'
E:\build22.06.2010_2034_func.cpp:17: error:   initializing argument 1 of `void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]'

E:\build22.06.2010_2034_func.cpp:22: error: return-statement with a value, in function returning 'void'
E:\build22.06.2010_2034_func.cpp:24: error: invalid conversion from `void*' to `const char*'
E:\build22.06.2010_2034_func.cpp:24: error:   initializing argument 1 of `void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]'
E:\build22.06.2010_2034_func.cpp:29: error: return-statement with a value, in function returning 'void'
E:\build22.06.2010_2034_func.cpp:63: error: return-statement with a value, in function returning 'void'
говорит о том что используются два противоположных хедера
Вложения
Тип файла: rar build22.06.2010_2034_func.rar (1.2 Кб, 10 просмотров)
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
22.06.2010, 21:58 58
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int textor(char *DelStart, char *DelStop, char *file_in_name, char *file_out_name){ 
   char buf[32769] = {'\0'};
   char *tmp;
 
   int f_c = 0;
   ifstream file_in;
   ofstream file_out;
 
   file_in.open(file_in_name);
   if (!file_in.is_open())
   {
      cerr << "Can not open input file" << endl;
      system("pause");
      return 1;
   }
   file_out.open(file_out_name);
   if (!file_out.is_open())
   {
      cerr << "Can not open output file" << endl;
      system("pause");
      return 1;
   }
     
   while (file_in.good())
   {
      file_in.getline(buf, 32768);
      if (!f_c)
      {
        if ((tmp = strstr(buf, DelStart)) != NULL)
         {
            *tmp = '\0';
            f_c = 1;
            for (int i = 0; i < strlen(buf); i++)
            {
               if (buf[i] != ' ' && buf[i] != '\t')
               {
                  file_out << buf << endl;
                  break;
               }
            }
            continue;
         }
         else
            file_out << buf << endl;
      }
      else
      {
         if ((tmp = strstr(buf, DelStop)) != NULL)
         {
            f_c = 0;
         }
      }
   }
   file_out.close();
   return 0;
}
 
 
int main(int argc, char* argv[]){
    char *DelStart = "/*";
    char *DelStop = "*/";
    char *file_in = "test.cpp";
    char *file_out = "testnocom.cpp.txt";
    textor(DelStart, DelStop, file_in, file_out);
    return 0;
}
1
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
22.06.2010, 22:15  [ТС] 59
про ошибки не пишет, но обработка функции не выходит видимо функция не возвращает ничего/
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
23.06.2010, 08:26 60
Лучший ответ Сообщение было отмечено как решение

Решение

ТС, есл хочешь работоспособный мой код, стукни в личку. Года 3 назад я его выкладывал на одном из форумов. Не лень будет, дам координаты, зарегаешься, найдёшь. А меня там забанили.
1
23.06.2010, 08:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2010, 08:26
Помогаю со студенческими работами здесь

Работа с файлами
помогите решить плиз!!!!!! зарание всем огромное спс!!! Задача 1. Дан файл целых чисел....

Работа с файлами
Задача из сборника Златопольского: 14.28. Имеется типизированный файл, элементами которого...

работа с файлами
1. Дан текстовый файл, фразы в котором отделены друг от друга точками, а слова – пробелами и...

Работа с файлами
Создать программу , которая создает файл и состоит из N строк . В первой строке напишите одну...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru