Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427

Файл-архив

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

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

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

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

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


Добавлено через 10 часов 16 минут
Обшарил гугль, ничего про файл-архив не нашёл...где хоть почитать можно?? Скажите плиз, кто знает..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2010, 07:52
Ответы с готовыми решениями:

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

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

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

8
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,303
26.05.2010, 13:13
В данном случае файл-архив это обычный файл.
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
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
26.05.2010, 18:20  [ТС]
То есть должно выглядеть так:

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
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,303
26.05.2010, 19: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
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
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
26.05.2010, 19:49  [ТС]
Спасибо, как всегда безупречно)) а во втором, в каталоге программы какие файлы нужно создать? только "output.txt", "in1.txt", "in2.txt", "in3.txt" или ещё S0 надо? и что такое SEEK_SET? скажите пожалуйста.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
26.05.2010, 19:53
Цитата Сообщение от kazak Посмотреть сообщение
#define N = 4
это...
C
1
#define N 4
1
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,303
26.05.2010, 20:11
Цитата Сообщение от 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
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
27.05.2010, 15:22  [ТС]
что-то у меня не выходит...в первой и во второй добавил <stdlib.h> , создал файлы к задачам. В первой - программа не может найти исходный файл, хотя всё задано верно. Во второй-вообще куча ошибок, причём почти все обращены к массиву. Подскажите, что может быть и в чём проблема. ???
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,303
27.05.2010, 17:01
Во второй было несколько опечаток, вот исправленная и немного переделанная версия
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2010, 17:01
Помогаю со студенческими работами здесь

Запароленный архив .exe
Привет всем. У меня такой вопрос.Есть архив в формате .exe и в нём типа должен быть текстовый файл. Архив запаролен. И так вот в чем вопрос...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru