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

Файл-архив - C++

Восстановить пароль Регистрация
 
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
26.05.2010, 07:52     Файл-архив #1
Всем доброго времени суток! В общем на днях задали пару задачек на файл-архив. Вот:

1) Дана строка S и файл-архив целых чисел, содержащий данные из не¬скольких (не более шести) файлов в формате: в первом элементе файла-архива хранится число N, в следующих N элементах хранится размер (число элементов) каждого из исходных файлов, а затем последовательно размещаются данные из каждого исходного файла. Для каждого из файлов, содержащихся в архиве, найти среднее арифметическое всех его элементов (вещественное число) и записать найденные числа (в том же порядке) в файл вещественных чисел с именем S.

2) Дана строка S0, целое число N (< 4) и N файлов целых чисел с именами S1, …, SN. Объединить их содержимое в новом файле-архиве с именем S0, последовательно записывая в него следующие данные: размер (число элементов) первого исходного файла и все элементы этого файла, размер второго исходного файла и все его элементы, …, размер N-го исходного файла и все его элементы.

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


Добавлено через 10 часов 16 минут
Обшарил гугль, ничего про файл-архив не нашёл...где хоть почитать можно?? Скажите плиз, кто знает..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2010, 07:52     Файл-архив
Посмотрите здесь:

Последовательная запись массива в .gz архив C++
Распаковать zip архив C++
C++ Прочитать 7z архив
TAR архив C++
Поставить пароль на архив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.05.2010, 13:13     Файл-архив #2
В данном случае файл-архив это обычный файл.
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
int num_file, sum, buf, i, j;
int *count_number;
double average;
FILE *file_in, *file_out;
...
fscanf(file_in, "%i", &num_file);
count_number = (int*)calloc(num_file, sizeof(int));
for (i = 0; i < num_file; i++)
{
   fscanf(file_in, "%i", &count_number[i]);
}
for (i = 0; i < num_file; i++)
{
   sum = 0;
   for (j = 0; j < count_number[i]; j++)
   {
      fscanf(file_in, "%i", &buf);
      sum += buf;
   }
   average = sum/(double)count_number[i];
   fprintf(file_out, "%f ", average);
}
...
Код строго для таких файлов:

Цитата Сообщение от Bloodykeeper Посмотреть сообщение
в первом элементе файла-архива хранится число N, в следующих N элементах хранится размер (число элементов) каждого из исходных файлов, а затем последовательно размещаются данные из каждого исходного файла.
Добавлено через 30 минут
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
#define N = 3
int  count, buf, i;
char *s0 = "output.txt";
char *s[N] = {"in1.txt", "in2.txt", "in3.txt"};
FILE *file_in, *file_out;
...
for (i = 0; i < N; i++)
{
   file_in = fopen(s[i], "r");
   count = 0;
   fscanf(file_in, "%i", &buf);
   while (!feof(file_in))
   {
      count++;
      fscanf(file_in, "%i", &buf);
   }
   fseek(file_in, 0, SEEK_SET);
   clearerr(file_in);
   fprintf(file_out, "%i ", count);
   fscanf(file_in, "%i", &buf);
   while (!feof(file_in))
   {
      fprintf(file_out, "%i ", buf);
      fscanf(file_in, "%i", &buf);
   }
   clearerr(file_in);
   fclose(file_in):
}
...
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
26.05.2010, 18:20  [ТС]     Файл-архив #3
То есть должно выглядеть так:

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
#define FIN_NAME "E:\\1AiP\\Task 5\\7\\file.txt"
#define FOUT_NAME "E:\\1AiP\\Task 5\\7\\s.txt"
.......
int num_file, sum, buf, i, j;
int *count_number;
double average;
FILE *file_in, *file_out;
if ( ( file_in = fopen(FIN_NAME, "r") ) == NULL ){
                perror("fopen");
                exit(EXIT_FAILURE);
fscanf(file_in, "%i", &num_file);
count_number = (int*)calloc(num_file, sizeof(int));
for (i = 0; i < num_file; i++)
{
   fscanf(file_in, "%i", &count_number[i]);
}
for (i = 0; i < num_file; i++)
{
   sum = 0;
   for (j = 0; j < count_number[i]; j++)
   {
      fscanf(file_in, "%i", &buf);
      sum += buf;
   }
   average = sum/(double)count_number[i];
   fprintf(file_out, "%f ", average);
}
 if ( fclose(file_in) )
                perror("fclose");
        
        if ( fprintf(file_out, "%f ", average)){
                perror("fprintf");      
                if ( fclose(file_out) )
                        perror("fclose");
                exit(1);
        }
        if ( fclose(file_out) )
                perror("fclose");
        printf("Operation complete!\n\n");
 
        exit(0);
}
А второй я что-то вообще не могу понять, что перед первым циклом нужно и куда тут строка, и к чему она вообще...) Объясните пожалуйста, и если не правильно, подправьте первую задачу, я сейчас не могу проверить правильность работы.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.05.2010, 19:41     Файл-архив #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
#include <stdio.h>
 
#define FIN_NAME "E:\\1AiP\\Task 5\\7\\file.txt"
#define FOUT_NAME "E:\\1AiP\\Task 5\\7\\s.txt"
 
int main()
{
   int num_file, sum, buf, i, j;
   int *count_number;
   double average;
   FILE *file_in, *file_out;
 
   if ( ( file_in = fopen(FIN_NAME, "r") ) == NULL )
   {
      perror("fopen file_in");
      exit(EXIT_FAILURE);
   }
   if ( ( file_out = fopen(FOUT_NAME, "w") ) == NULL )
   {
      perror("fopen file_out");
      exit(EXIT_FAILURE);
   }
   fscanf(file_in, "%i", &num_file);
   count_number = (int*)calloc(num_file, sizeof(int));
   for (i = 0; i < num_file; i++)
   {
      fscanf(file_in, "%i", &count_number[i]);
   }
   for (i = 0; i < num_file; i++)
   {
      sum = 0;
      for (j = 0; j < count_number[i]; j++)
      {
         fscanf(file_in, "%i", &buf);
         sum += buf;
      }
      average = sum/(double)count_number[i];
      fprintf(file_out, "%f ", average);
   }
   fclose(file_in);
   fclose(file_out);
   return 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
41
42
43
44
45
#include <stdio.h>
 
#define N = 4
 
int main()
{
   int  count, buf, i;
   char *s[N] = {"output.txt", "in1.txt", "in2.txt", "in3.txt"};/*массив строк содержащих имена выходного и входных файлов*/
   FILE *file_in, *file_out;
 
   if ((file_out = fopen(s[0], "w")) == NULL )
   {
      perror("fopen file_out\n");
      exit(EXIT_FAILURE);
   }
   for (i = 1; i < N; i++)
   {
      count = 0;
      if ((file_in = fopen(s[i], "r") == NULL)
      {
         perror("fopen file_in\n");
         fprintf(file_out, "%i ", count);
         continue;
      }
      fscanf(file_in, "%i", &buf);
      while (!feof(file_in))
      {
         count++;
         fscanf(file_in, "%i", &buf);
      }
      fseek(file_in, 0, SEEK_SET);
      clearerr(file_in);
      fprintf(file_out, "%i ", count);
      fscanf(file_in, "%i", &buf);
      while (!feof(file_in))
      {
         fprintf(file_out, "%i ", buf);
         fscanf(file_in, "%i", &buf);
      }
      clearerr(file_in);
      fclose(file_in):
   }
   fclose(file_out);
   return 0;
}
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
26.05.2010, 19:49  [ТС]     Файл-архив #5
Спасибо, как всегда безупречно)) а во втором, в каталоге программы какие файлы нужно создать? только "output.txt", "in1.txt", "in2.txt", "in3.txt" или ещё S0 надо? и что такое SEEK_SET? скажите пожалуйста.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.05.2010, 19:53     Файл-архив #6
Цитата Сообщение от kazak Посмотреть сообщение
#define N = 4
это...
C
1
#define N 4
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.05.2010, 20:11     Файл-архив #7
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
только "output.txt", "in1.txt", "in2.txt", "in3.txt" или ещё S0 надо?
S0 не требуется я его в s[0] превратил, названия файлов можешь изменить по своему усмотрению.

Цитата Сообщение от Bloodykeeper Посмотреть сообщение
что такое SEEK_SET
Функция fseek(FILE *stream, long offset, int whence) перемещает указатель в файле, принимает три параметра: файл в котором перемещается указатель, количество байт на которое надо сместить указатель, и точку отсчета. Точка отсчета бывает трех видов:
SEEK_SET - относительно начала файла (к концу)
SEK_CUR - относительно текущей позиции (к концу или к началу +\-)
SEEK_END - относительно конца файла (к началу)
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
27.05.2010, 15:22  [ТС]     Файл-архив #8
что-то у меня не выходит...в первой и во второй добавил <stdlib.h> , создал файлы к задачам. В первой - программа не может найти исходный файл, хотя всё задано верно. Во второй-вообще куча ошибок, причём почти все обращены к массиву. Подскажите, что может быть и в чём проблема. ???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2010, 17:01     Файл-архив
Еще ссылки по теме:

C++ Как создать свой архив, упаковывать и распаковывать?
Как расшифровать libGRF архив? C++
Как распаковать архив ZLib C++ C++

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

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
27.05.2010, 17:01     Файл-архив #9
Во второй было несколько опечаток, вот исправленная и немного переделанная версия
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
#include <stdio.h>
#include <stdlib.h>
#define N  4
 
int main()
{
   int  count, buf, i;
   char *s[N] = {"output.txt", "in1.txt", "in2.txt", "in3.txt"};/*Г¬Г*Г±Г±ГЁГў ñòðîê ñîäåðæГ*Г№ГЁГµ èìåГ*Г* âûõîäГ*îãî ГЁ âõîäГ*ûõ ГґГ*éëîâ*/
   FILE *file_in, *file_out;
 
   if ((file_out = fopen(s[0], "w")) == NULL )
   {
      perror("fopen file_out ");
      exit(EXIT_FAILURE);
   }
   for (i = 1; i < N; i++)
   {
      count = 0;
      if ((file_in = fopen(s[i], "r")) == NULL)
      {
         perror("fopen file_in ");
         fprintf(file_out, "%i ", count);
         continue;
      }
      while (fscanf(file_in, "%i", &buf) != EOF)
      {
         count++;
      }
      fseek(file_in, 0, SEEK_SET);
      clearerr(file_in);
      fprintf(file_out, "%i ", count);
      while (fscanf(file_in, "%i", &buf) != EOF)
      {
         fprintf(file_out, "%i ", buf);
      }
      clearerr(file_in);
      fclose(file_in);
   }
   fclose(file_out);
   return 0;
}
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
В первой - программа не может найти исходный файл
Проверяй правильность пути и наличие самого файла
Yandex
Объявления
27.05.2010, 17:01     Файл-архив
Ответ Создать тему
Опции темы

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