Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
#1

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

26.05.2010, 07:52. Просмотров 843. Ответов 8
Метки нет (Все метки)

Всем доброго времени суток! В общем на днях задали пару задачек на файл-архив. Вот:

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

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

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


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

Прочитать 7z архив - C++
Доброго времени суток. Нужно прочитать 7z архив. А именно достать инфу(список файлов, версия архиватора и тп). Может кто подскажет под...

TAR архив - C++
Добрый день! Как реализовать архивацию указанного каталога TAR-архивом? Добавлено через 3 минуты Извините забыл добавить написание...

Распаковать zip архив - C++
Нужно распаковать все файлы из zip архива (или tar.gz). Подключил zlib. zip архив находится рядом с .exe файлом приложения. Не могу...

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

Как достать архив из exe - C++
Короче, нужно засунуть архив в exe и при запуске программа должна вытащить этот архив на рабочий стол. Подскажите как это можно...

Последовательная запись массива в .gz архив - C++
Имеется спосок товаров ввиде массива. Элементы массива перебираю в цикле for и далее необходимо сразу записывать в gzip архив. Нашел...

8
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
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):
}
...
1
Bloodykeeper
This party getting crazy!
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);
}
А второй я что-то вообще не могу понять, что перед первым циклом нужно и куда тут строка, и к чему она вообще...) Объясните пожалуйста, и если не правильно, подправьте первую задачу, я сейчас не могу проверить правильность работы.
0
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
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;
}
1
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
26.05.2010, 19:49  [ТС] #5
Спасибо, как всегда безупречно)) а во втором, в каталоге программы какие файлы нужно создать? только "output.txt", "in1.txt", "in2.txt", "in3.txt" или ещё S0 надо? и что такое SEEK_SET? скажите пожалуйста.
0
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
26.05.2010, 19:53 #6
Цитата Сообщение от kazak Посмотреть сообщение
#define N = 4
это...
C
1
#define N 4
1
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
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 - относительно конца файла (к началу)
1
Bloodykeeper
This party getting crazy!
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
27.05.2010, 15:22  [ТС] #8
что-то у меня не выходит...в первой и во второй добавил <stdlib.h> , создал файлы к задачам. В первой - программа не может найти исходный файл, хотя всё задано верно. Во второй-вообще куча ошибок, причём почти все обращены к массиву. Подскажите, что может быть и в чём проблема. ???
0
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
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 Посмотреть сообщение
В первой - программа не может найти исходный файл
Проверяй правильность пути и наличие самого файла
1
27.05.2010, 17:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2010, 17:01
Привет! Вот еще темы с ответами:

Как распаковать архив ZLib C++ - C++
Даже в документации офф. сайта, и в и примере ничего не понятно. Надо написать класс для распаковки zip архива на основе ZLib, с методом...

Как расшифровать libGRF архив? - C++
Есть архив, который создан с помощью libgrf, он же зашифрован с помощью библиотеки zlib1.dll (исходя из того, что она присутствует в...

Как создать свой архив, упаковывать и распаковывать? - C++
как создать свой архив упаковывать и распаковывать скиньте ссылки и коды примеров пожалуста :) на C++ с возможность...

Господа, нужно выбрать double-архив из строки string(С++/С) - C++
Есть строка формата: string str=&quot;R 7.2 531.804 119.479 0.477472 175.792 7.22212 -64.2461 0 79.5401 -0.600769 ...


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

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

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