Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
1

Как передать в функцию в качестве параметров указатель на файл

25.04.2015, 14:54. Просмотров 926. Ответов 5
Метки нет (Все метки)


В общем есть функция (Copy_System_Files_To_New_System_Files), которая должна делать 4 раза одно и тоже действие, только с разными указателями на файлы.
Сейчас я сделал эти указатели глобальными и в функции выполняется практически одинаковый код 4 раза, ну сами понимаете, куда это годится? Подскажите как передать в таком случае в функцию два файловых указателя. В общем вот этот говнокод:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
// 21. Удалить из системны пользователей, которые принадлежат указанным группам.
// Изменения системных файлов записать в новые файлы, старые систмные файлы оставить без изменений.
// Имена выходных файлов и файл с именами групп передать при запуске программы (через вх. параметры)
 
#include <stdio.h>    // for printf
#include <stdlib.h>
#include <dirent.h>   // for directories
#include <sys/stat.h> // for status
#include <unistd.h>   // for close, read
#include <string.h>   // for strlen
#include <grp.h>
#include <pwd.h>
 
void Open_System_Files (void);
void Copy_System_Files_To_New_System_Files (void);
void Close_System_Files (void);
void Close_New_System_Files (void);
 
FILE *f_name_group;                                              // указатель на файл c именами групп
FILE *f_passwd,*f_group,*f_shadow,*f_gshadow;                    // указатели на системные файлы
FILE *f_new_passwd,*f_new_group,*f_new_shadow,*f_new_gshadow;    // указатели на отредактированные системные файлы
int err_file;                                                    // признак ошибки открытия какого-либо
 
int main(int argc, char *argv[])
{  
  char name_group[10][20]; // массив из 10 строк, каждая длинной в 20 символов
  int count_name_group=0;  // количество имён групп, пользователей которых нужно удалить
  int i,count_str=0;
  struct group *my_group;
  char **buf_str;
  char **members;
  char buf_name[1][128];
 
   
//--------------ПРОВЕРКА ВХОДНЫХ ПАРАМЕТРОВ И ОТКРЫТИЕ ФАЙЛОВ-----------------------------------------------------------
   if (argc == 6)                                                          // если все входные параметры заданы
   { 
     printf("argc = %d\n",argc);
     if ((f_name_group = fopen(argv[1], "rt")) == NULL)
     {                                                                     // если не удалось открыть файл для ЧТЕНИЯ
      printf("\nERROR! File '%s' was not opened for reading!\n",argv[1]);  // вывести на экран сообщение
      err_file=-1;                                                        
     }
//-------------Формирование массива с именами групп, пользователей которых нужно удалить--------------------------------
     printf("Names group for deleting users: ");
    while (fscanf(f_name_group, "%s", name_group[count_name_group]) != EOF)  // читаем файл  построчно в массив строк
     {
      printf("%s ", name_group[count_name_group]); 
      count_name_group++;
     }
     fclose(f_name_group);                                                   // закрыть файл после чтения
//----------Открытие новых файлов, куда будем записывать преобразованные системные файлы--------------------------------
     if ((f_new_passwd = fopen(argv[2], "wt")) == NULL) 
     {                                                                     // если не удалось открыть файл для ЗАПИСИ
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[2]);  // вывести на экран сообщение
      err_file=-1;                                                         
     }
     if ((f_new_group = fopen(argv[3], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[3]); 
      err_file=-1;                                                             
     }
     if ((f_new_shadow = fopen(argv[4], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[4]); 
      err_file=-1;                                                          
     }
     if ((f_new_gshadow = fopen(argv[5], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[5]); 
      err_file=-1;                                                           
     }   
     Open_System_Files();                                                    // открытие исходных системных файлов 
     if (err_file==-1) return -1;
     
     Copy_System_Files_To_New_System_Files();
    // Close_System_Files ();                         // закрытие системных файлов
//-----------------------------------------------------------------------------------------------------------------------
    while (count_name_group>0)
    {
    my_group=getgrnam(name_group[count_name_group-1]); //получаем указатель на структуру группы по имени.
    if (my_group == NULL) printf ("\nError! User group not found! \n");
    members = my_group->gr_mem;  //получаем имена пользователей этой группы
    printf ("\nCheck - > Name_group: %s\n", my_group->gr_name);
     while (*members) //проходим по именам пользователей
      {
       printf ("Check - > Name_User: %s\n", *(members));
      // fseek(f_new_passwd, 0L, SEEK_SET);
         rewind(f_passwd);
       /*  while (fscanf(f_new_passwd, "%s", buf_name[0]) !=EOF) 
          {
           printf ("Chek buf_str-> %s\n", buf_name[0]);
           if(buf_name[0]==*(members))
              printf("DELETE\n"); 
           else printf("no\n");
          }
          printf ("next member\n");
        */
        //fgets(buf_name[1], 128, f_new_passwd);
      fscanf(f_passwd, "%s", buf_name[1]);
      printf ("Chek buf_str-> %s\n", buf_name[1]);
       
       members++;
       }       
    
    count_name_group--;
    } //end while
       
   } else {printf("ERROR! Check input parameters!\n"); return -1; } 
   // ------ПРОГРАММА ЗАВЕРШЕНА--------------------------------------------------------------------------------------------
  printf("\nProgram has been successfully completed!\n");                  
  return 0;
} //end main()
    
void Open_System_Files (void) // Процедура открытия исходных системных файлов
{
     if ((f_passwd = fopen("../../etc/passwd", "rt")) == NULL) 
     {                                                                       
      printf("\nERROR! File 'passwd' was not opened for reading!\n");    
      err_file=-1;                                                               
     }
     if ((f_group = fopen("../../etc/group", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'group' was not opened for reading!\n"); 
      err_file=-1;                                                          
     }
     if ((f_shadow = fopen("../../etc/shadow", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'shadow' was not opened for reading!\n"); 
      err_file=-1;                                                           
     }
     if ((f_gshadow = fopen("../../etc/gshadow", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'gshadow' was not opened for reading!\n"); 
      err_file=-1;                                                          
     }
}
 
void Close_System_Files (void) // Процедура закрытия исходных системных файлов
{
    fclose(f_passwd); 
    fclose(f_group); 
    fclose(f_shadow);
    fclose(f_gshadow);       
}
 
void Close_New_System_Files (void) // Процедура закрытия исходных системных файлов
{
    fclose(f_new_passwd); 
    fclose(f_new_group); 
    fclose(f_new_shadow);
    fclose(f_new_gshadow);  
}
 
void Copy_System_Files_To_New_System_Files (void) //Процедура копирования системных файлов для последующей обработки
{   
char str[128];
char *estr;
//---------passwd----------------------------------------
   while (1)
   {
   estr = fgets (str,sizeof(str),f_passwd);
    if (estr == NULL)
     {
      if ( feof (f_passwd) != 0)
       break;  //всё норм, файл кончился
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_passwd); //копируем в другой файл
   }
//-------------group-------------------------------------  
   while (1)
   {
   estr = fgets (str,sizeof(str),f_group);
    if (estr == NULL)
     {
      if ( feof (f_group) != 0)
       break;  
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_group); 
   }
//-------------shadow-----------------------------------  
   while (1)
   {
   estr = fgets (str,sizeof(str),f_shadow);
    if (estr == NULL)
     {
      if ( feof (f_shadow) != 0)
       break;  
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_shadow); 
   }
//----------gshadow--------------------------------------  
   while (1)
   {
   estr = fgets (str,sizeof(str),f_gshadow);
    if (estr == NULL)
     {
      if ( feof (f_gshadow) != 0)
       break; 
      else
        {
         printf ("\nError read file\n");
         break;
        }
      }
      fputs(str, f_new_gshadow); 
   } 
 } //end Copy_System_Files_To_New_System_Files
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2015, 14:54
Ответы с готовыми решениями:

как правильно передать в качестве параметров указатель на тип QPainter ?
QPixmap *pix = new QPixmap(500,500); QPainter *pp = new QPainter(pix);...

Как передать функции указатель на функцию в качестве аргумента?
как передать функции указатель на функцию в качестве аргумента?

как передать функции в качестве аргумента указатель на функцию описанной в другом классе?
Есть два класса A и B в классе A есть две функции funcA_1 и funcA_2 в классе B - funcB в...

Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции)
Подскажите как передать указатель на файл в функцию, как вернуть указатель на файл из функции. ...

5
Модератор
Эксперт С++
10413 / 8680 / 5250
Регистрация: 18.12.2011
Сообщений: 23,211
25.04.2015, 15:02 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
 // Процедура открытия исходных системных файлов
int Open_System_Files (FILE** f_passwd,FILE** f_group,FILE** f_shadow,FILE** f_gshadow)
{
     int err_file=0;
     if ((*f_passwd = fopen("../../etc/passwd", "rt")) == NULL) 
     {                                                                       
      printf("\nERROR! File 'passwd' was not opened for reading!\n");    
      err_file=-1;                                                               
     }
     if ((*f_group = fopen("../../etc/group", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'group' was not opened for reading!\n"); 
      err_file=-1;                                                          
     }
     if ((*f_shadow = fopen("../../etc/shadow", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'shadow' was not opened for reading!\n"); 
      err_file=-1;                                                           
     }
     if ((*f_gshadow = fopen("../../etc/gshadow", "rt")) == NULL) 
     {                                                                  
      printf("\nERROR! File 'gshadow' was not opened for reading!\n"); 
      err_file=-1;                                                          
     }
     retrun err_file;
}
1
239 / 212 / 84
Регистрация: 18.03.2010
Сообщений: 750
25.04.2015, 15:08 3
Цитата Сообщение от Neuling Посмотреть сообщение
Подскажите как передать в таком случае в функцию два файловых указателя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Copy_System_Files_To_New_System_Files (FILE * fl1, FILE * fl2);
 
int main(int argc, char *argv[])
{ 
    FILE *f1, *f2;
    //*****
    Copy_System_Files_To_New_System_Files(f1, f2);
    //*****
    //*****
}
 
void Copy_System_Files_To_New_System_Files (FILE * fl1, FILE * fl2)
{
    //********
}
1
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 15:14  [ТС] 4
zss, подскажите пожалуйста как в таком случае будет выглядеть прототип функции и вызов функции. И там нужен всё таки указатель на указатель, или просто указатель? Ниже jonson пишет, что просто указатель.
0
Модератор
Эксперт С++
10413 / 8680 / 5250
Регистрация: 18.12.2011
Сообщений: 23,211
25.04.2015, 15:20 5
Прототип
C++
1
int Open_System_Files (FILE** f_passwd,FILE** f_group,FILE** f_shadow,FILE** f_gshadow);
Вызов
C++
1
2
FILE *f_passwd,*f_group,*f_shadow,*f_gshadow;
int Error=Open_System_Files (&f_passwd,&f_group,&f_shadow,&f_gshadow);
Добавлено через 3 минуты
Кстати, как уже написал jonson, в остальные функции действительно можно передавать указатель,
а не его адрес, т.к. в них его значение не меняется.
1
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 17
25.04.2015, 17:07  [ТС] 6
Спасибо всем за ответы. Попробую, о результатах отпишусь. А то самому неприятно смотреть на такой код. А мат часть совсем позабывал.

Добавлено через 14 минут
А ещё такой вопрос, каким образом можно предать в качестве параметров функции, параметры командной строки??? Хочу выделить вот этот вот участок кода в функцию.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//----------Открытие новых файлов, куда будем записывать преобразованные системные файлы-------------------------
     if ((f_new_passwd = fopen(argv[2], "wt")) == NULL) 
     {                                                                     // если не удалось открыть файл для ЗАПИСИ
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[2]);  // вывести на экран сообщение
      err_file=-1;                                                         
     }
     if ((f_new_group = fopen(argv[3], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[3]); 
      err_file=-1;                                                             
     }
     if ((f_new_shadow = fopen(argv[4], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[4]); 
      err_file=-1;                                                          
     }
     if ((f_new_gshadow = fopen(argv[5], "wt")) == NULL) 
     {                                                                  
      printf("\nERROR! File '%s' was not opened for writing!\n",argv[5]); 
      err_file=-1;                                                           
     }
Добавлено через 1 час 21 минуту
Вопрос решен, спасибо!)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2015, 17:07

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

Как передать указатель на файл в функцию?
Здравствуй по ходу написания программы столкнулся с вопросом как передать указатель на тип файл в...

Как передать матрицы методу в качестве параметров для результата
Как передать матрицы sliced_matrix и random_matrix методу SumMatrix в качестве параметров для...

Как передать функцию из класса в другую функцию (в качестве параметра)?
У меня есть такой класс: Class a{ static public function sum($a, $b) { return $a+$b; } ...

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){};...


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

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

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