Работа с файлами

Язык Си / Работа с файлами

 

Для удобства обращения информация в запоминающих устройствах хранится в виде файлов.
 
Файл – именованная область внешней памяти, выделенная для хранения массива данных. Данные, содержащиеся в файлах, имеют самый разнообразный характер: программы на алгоритмическом или машинном языке; исходные данные для работы программ или результаты выполнения программ; произвольные тексты; графические изображения и т. п.
 
Каталог (папка, директория) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов.
 
Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках).
 
Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт).

 
Рассмотрим структуру файловой системы на примере FAT32.
 

Файловая структура FAT32

Устройства внешней памяти в системе FAT32 имеют не байтовую, а блочную адресацию. Запись информации в устройство внешней памяти осуществляется блоками или секторами.
 
Сектор – минимальная адресуемая единица хранения информации на внешних запоминающих устройствах. Как правило, размер сектора фиксирован и составляет 512 байт. Для увеличения адресного пространства устройств внешней памяти сектора объединяют в группы, называемые кластерами.
 
Кластер – объединение нескольких секторов, которое может рассматриваться как самостоятельная единица, обладающая определёнными свойствами. Основным свойством кластера является его размер, измеряемый в количестве секторов или количестве байт.
 

Файловая система FAT32 имеет следующую структуру.
Файловая система FAT32
Нумерация кластеров, используемых для записи файлов, ведется с 2. Как правило, кластер №2 используется корневым каталогом, а начиная с кластера №3 хранится массив данных. Сектора, используемые для хранения информации, представленной выше корневого каталога, в кластеры не объединяются.
Минимальный размер файла, занимаемый на диске, соответствует 1 кластеру.

Загрузочный сектор начинается следующей информацией:

  • EB 58 90 – безусловный переход и сигнатура;
  • 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
  • 00 02 – количество байт в секторе (обычно 512);
  • 1 байт – количество секторов в кластере;
  • 2 байта – количество резервных секторов.

Кроме того, загрузочный сектор содержит следующую важную информацию:

  • 0x10 (1 байт) – количество таблиц FAT (обычно 2);
  • 0x20 (4 байта) – количество секторов на диске;
  • 0x2С (4 байта) – номер кластера корневого каталога;
  • 0x47 (11 байт) – метка тома;
  • 0x1FE (2 байта) – сигнатура загрузочного сектора (55 AA).

 
Сектор информации файловой системы содержит:

  • 0x00 (4 байта) – сигнатура (52 52 61 41);
  • 0x1E4 (4 байта) – сигнатура (72 72 41 61);
  • 0x1E8 (4 байта) – количество свободных кластеров, -1 если не известно;
  • 0x1EС (4 байта) – номер последнего записанного кластера;
  • 0x1FE (2 байта) – сигнатура (55 AA).

 
Таблица FAT содержит информацию о состоянии каждого кластера на диске. Младшие 2 байт таблицы FAT хранят F8 FF FF 0F FF FF FF FF (что соответствует состоянию кластеров 0 и 1, физически отсутствующих). Далее состояние каждого кластера содержит номер кластера, в котором продолжается текущий файл или следующую информацию:

  • 00 00 00 00 – кластер свободен;
  • FF FF FF 0F – конец текущего файла.

 
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:

  • 8 байт – имя файла;
  • 3 байта – расширение файла;

 
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:

  • 8 байт – имя файла;
  • 3 байта – расширение файла;
  • 1 байт – атрибут файла:
    Артибуты файла
  • 1 байт – зарезервирован;
  • 1 байт – время создания (миллисекунды) (число от 0 до 199);
  • 2 байта – время создания (с точностью до 2с):
    Время файла
  • 2 байта – дата создания:
    Дата файла
  • 2 байта – дата последнего доступа;
  • 2 байта – старшие 2 байта начального кластера;
  • 2 байта – время последней модификации;
  • 2 байта – дата последней модификации;
  • 2 байта – младшие 2 байта начального кластера;
  • 4 байта – размер файла (в байтах).

 
В случае работы с длинными именами файлов (включая русские имена) кодировка имени файла производится в системе кодировки UTF-16. При этого для кодирования каждого символа отводится 2 байта. При этом имя файла записывается в виде следующей структуры:

  • 1 байт последовательности;
  • 10 байт содержат младшие 5 символов имени файла;
  • 1 байт атрибут;
  • 1 байт резервный;
  • 1 байт – контрольная сумма имени DOS;
  • 12 байт содержат младшие 3 символа имени файла;
  • 2 байта – номер первого кластера;
  • остальные символы длинного имени.

Далее следует запись, включающая имя файла в формате 8.3 в обычном формате.

Работа с файлами в языке Си

Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода. Выводимая информация записывается в поток, вводимая информация считывается из потока.

Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE, которая определена в stdio.h. Структура FILE содержит необходимую информацию о файле.

Открытие файла осуществляется с помощью функции fopen(), которая возвращает указатель на структуру типа FILE, который можно использовать для последующих операций с файлом.

 
FILE *fopen(name, type);

name – имя открываемого файла (включая путь),
type — указатель на строку символов, определяющих способ доступа к файлу:

  • "r" — открыть файл для чтения (файл должен существовать);
  • "w" — открыть пустой файл для записи; если файл существует, то его содержимое теряется;
  • "a" — открыть файл для записи в конец (для добавления); файл создается, если он не существует;
  • "r+" — открыть файл для чтения и записи (файл должен существовать);
  • "w+" — открыть пустой файл для чтения и записи; если файл существует, то его содержимое теряется;
  • "a+" — открыть файл для чтения и дополнения, если файл не существует, то он создаётся.

 
Возвращаемое значение — указатель на открытый поток. Если обнаружена ошибка, то возвращается значение NULL.

Функция fclose() закрывает поток или потоки, связанные с открытыми при помощи функции fopen() файлами. Закрываемый поток определяется аргументом функции fclose().

Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF, если произошла ошибка.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main() {
  FILE *fp;
  char name[] = "my.txt";
  if ((fp = fopen(name, "r")) == NULL)
  {
    printf("Не удалось открыть файл");
    getchar();
    return 0;
  }
  // открыть файл удалось
  ...      // требуемые действия над данными
  fclose(fp);
  getchar();
  return 0;
}


Чтение символа из файла:
 
char fgetc(поток);

Аргументом функции является указатель на поток типа FILE. Функция возвращает код считанного символа. Если достигнут конец файла или возникла ошибка, возвращается константа EOF.

Запись символа в файл:
 
fputc(символ,поток);

Аргументами функции являются символ и указатель на поток типа FILE. Функция возвращает код считанного символа.

Функции fscanf() и fprintf() аналогичны функциям scanf() и printf(), но работают с файлами данных, и имеют первый аргумент — указатель на файл.

 
fscanf(поток, "ФорматВвода", аргументы);

 
fprintf(поток, "ФорматВывода", аргументы);


Функции fgets() и fputs() предназначены для ввода-вывода строк, они являются аналогами функций gets() и puts() для работы с файлами.
 
fgets(УказательНаСтроку, КоличествоСимволов, поток);

Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки ‘\n’, который включается в строку, или пока не наступит конец потока EOF или не будет прочитано максимальное количество символов. Результат помещается в указатель на строку и заканчивается нуль- символом ‘\0’. Функция возвращает адрес строки.

 
fputs(УказательНаСтроку,поток);

Копирует строку в поток с текущей позиции. Завершающий нуль- символ не копируется.
Пример Ввести число и сохранить его в файле s1.txt. Считать число из файла s1.txt, увеличить его на 3 и сохранить в файле s2.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
int main()
{
  FILE *S1, *S2;
  int x, y;
  system("chcp 1251");
  system("cls");
  printf("Введите число : ");
  scanf("%d", &x);
  S1 = fopen("S1.txt", "w");
  fprintf(S1, "%d", x);
  fclose(S1);
  S1 = fopen("S1.txt", "r");
  S2 = fopen("S2.txt", "w");
  fscanf(S1, "%d", &y);
  y += 3;
  fclose(S1);
  fprintf(S2, "%d\n", y);
  fclose(S2);
  return 0;
}

Результат выполнения — 2 файла
Считать число из файла
Работа с файлами в C++ описана здесь.


Назад: Язык Си

Комментариев к записи: 98

  • Как-то можно передать FILE* в другую функцию? Например:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    int main () {
        FILE* fn;
        fr_file_open_read(&(*fn);
    }
    void fr_file_open_read(FILE *fn){
        fopen(fn, "r");
    }

    при таком написании компилятор говорит, что 'fn' may be used uninitialized

    • Так и есть. Указателю ещё не присвоено значение (он не связан ни с каким файлом), и он передается в качестве аргумента

    • 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
      #include "Header.h"

      int main(void) {
       system("chcp 1251>nul");
       FILE* file = fopen("zad1.txt", "r");
       treg* Treg = calloc(0, sizeof(treg));//создаем массив структур, в которую
       //будем помещать данные о треугольниках
       int n = -1, nRows = 0, countStr = 0;//n - количество треугольников (или вершин, если нельзя построить)
       int* rows = calloc(0, 4);//массив, в котором содержатся номера правильных строк
       // 2 4 5
       char* buffer = calloc(100, 1);
       int boolSimvol = 0;
       while (!feof(file)) {
        fgets(buffer, 100, file);
        countStr++;
        for (int i = 0; i < strlen(buffer) - 1; i++)
         //strlen - выводит количество символов в строке
        {
         if ((buffer[i] >= '0' && buffer[i] <= '9') || buffer[i] == '.' 
          || buffer[i] == ' ' || buffer[i] == '-') {
          boolSimvol = 0;
         }
         else {
          boolSimvol = 1;
          break;
         }
        }
        if (boolSimvol == 0) {
         int probel = 0;
         for (int i = 0; i < strlen(buffer); i++) {
          if (buffer[i] == ' ') {
           probel++;
          }
         }
         if (probel == 5) {
          nRows++;
          rows = realloc(rows, nRows * 4);
          rows[nRows - 1] = countStr; //row[0] = 2 - частный случай
         }
        }
        free(buffer);
        buffer = calloc(100, 1);
       }
       printf("Строки, подходящие под шаблон:");
       for (int i = 0; i < nRows; i++) {
        printf(" %d", rows[i]);
       }
       fclose(file);
       file = fopen("zad1.txt", "r");
       countStr = 0; 
       while (!feof(file)) {
        countStr++;//число строки в данный момент
        for (int i = 0; i < nRows; i++) {
         if (countStr == rows[i]) {
          n++;
          Treg = realloc(Treg, n+1 * sizeof(Treg));
          fscanf(file, "%f %f %f %f %f %f", &Treg[n].x1, &Treg[n].y1,
           &Treg[n].x2, &Treg[n].y2, &Treg[n].x3, &Treg[n].y3);
          printf("\n%.2f %.2f %.2f %.2f %.2f %.2f", Treg[n].x1, Treg[n].y1,
           Treg[n].x2, Treg[n].y2, Treg[n].x3, Treg[n].y3);
          break;
         }
        }
        char* buffer = calloc(100, 1);
        fgets(buffer, 100, file);
        free(buffer);
       }
      }

  • Добрый день. Подскажите пожалуйста, возможно ли в С++ читать содержимое только файлов имеющих в своём имени только цифры? Например читать: 56.txt, 78.txt,99.txt и т.д. И не читать hellou.txt. Если да какие библиотеки и функции нужно использовать? В интернете по обработке имен файлов мало инфы.

    • Елена Вставская
      Возможно сделать проверку имени файла на соответствие формату. Но само имя файла задаётся пользователем.

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

    • Елена Вставская
      Считать количество выведенных символов в строке и длину следующего слова. Если количество символов +длина слова больше 80, то нужно перенести строчку и начать вывод с новой строки. При этом пост вольный вывод не получится - придется использовать буфер (массив) для хранения следующего слова.

  • Владислав
    Здравствуйте Елена, помогите пожалуйста решить проблему. Программа написанная на C# создаёт отчёт в форме MS Word в папке с файлами программы. Какую функцию надо подключить чтобы была возможность выбрать путь сохранения созданного отчёта?

  • Здравствуйте, такой вопрос: У меня есть функция, в которой я несколько раз открываю файл и закрываю. Нужно ли перед каждым открытием файла делать проверку на file == NULL?


      • Оговорился. То есть после каждого открытия файла В ОДНОЙ ФУНКЦИи, желательно делать проверку на file == NULL? Пример:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        void Zadanie
        {
            float k1, k2;
            FILE *zad_5;
            zad_5 = fopen("zadanie5.txt", "r");
            if(zad_5 == NULL)
            {
                printf("Ошибка открытия файла");
                return 1;
            }
            fscanf(zad_5, "%f %f", &k1, &k2);
            fclose(zad_5);

            zad_5 = fopen("zadanie5.txt", "a");
            if(zad_5 == NULL)
            {
                printf("Ошибка открытия файла");
                return 1;
            }
                fprintf(zad_5, "k1^2 = %d, k2^2 = %d", k1*k1, k2*k2);
                }
            }
            fclose(zad_5);
        }

  • Как можно реализовать возможность перезаписи файла после достижения определенного момента? Т.е. есть файл, в который периодически записываются значения, нужно, чтобы после достижения 120 строк в файле шла перезапись первых записей (т.е. цикличная запись). Т.е. идет 118 строка, 119 строка, 120 строка, затем идет 121 строка, но она перезаписывает 1 строку, строка 122 перезаписывает строку 2. Думаю вы поняли.

    • Елена Вставская
      Если переместить указатель в начало файла и записать строку, то она запишется поверх первой строки. Однако заменятся столько символов, сколько содержит вновь записываемая строка. Поэтому способ, который я вижу - это держать буфер строк с ОЗУ, каждый раз менять требуемую строку и перезаписывать все строки в файл. Буду рада если кто-то предложит способ лучше.

  • Александр
    char fgetc(поток); -это не правильно EOF не умещается в тип char - сперва надо считывать в переменную типа int, потом проверять нет ли EOF и только потом кастовать в char.

  • Владимир
    Добрый день, Елена. В программе на С надо произвести запись в файл двух блоков по 8 байт и закрыть файл. С этим все нормально. Далее надо открыть этот файл и произвести чтение из него двух блоков по 8 байт. Файл успешно открывается, но чтение происходит не с первого блока, а со второго т.е. первый блок не читается. Как произвести чтение файла начиная с первого блока ?

    • Елена Вставская
      Надо код смотреть. Попробуйте использовать функцию fseek() для перемещения позиции курсора в файле.


        • Елена Вставская
          Перемещает указатель положения в файле на начало потока

      • Владимир
        Спрошу тут же по другой теме. uint32_t* plain = (uint32_t*)plain_buffer; - это оператор присвоения с приведением типа. Смущает что в операторе происходит еще объявление указателя *plain. Но многократное повторение в программе оператора присвоения uint32_t* plain = (uint32_t*)plain_buffer; не вызывает ошибки при компиляции о том, что указатель *plain объявлен несколько раз.


          • Владимир
            uint32_t* plain = (uint32_t*)plain_buffer; .......................................... uint32_t* plain = (uint32_t*)plain_buffer; .......................................... uint32_t* plain = (uint32_t*)plain_buffer; Строка трижды повторяется в программе. Это допустимо ?

          • Елена Вставская
            Если каждый вызов внутри своих фигурных скобок, то допустимо

          • Владимир
            Функции rewind(ptrFile); и fseek(ptrFile, 0, SEEK_SET); равноценны ?


          • Владимир
            А если этот оператор uint32_t* plain = (uint32_t*)plain_buffer; надо многократно использовать внутри одних и тех же фигурных скобок, то что делать ?

          • Елена Вставская
            Объявить один раз, а потом переприсваивать. При этом старое значение теряется!

          • Владимир
            Вопрос с многократным повторением оператора uint32_t* plain = (uint32_t*)plain_buffer; в программе решается просто. Однажды объявляем указатель uint32_t* plain;, а далее можно повторять в программе plain = (uint32_t*)plain_buffer; сколь угодно много раз.

  • Елена, добрый день! Помогите, пожалуйста, с программой Задание: Разработать программу на языке С, которая осуществляет следующие действия Создает область памяти размером 192 мегабайт, начинающихся с адреса 0x38225FFA (если возможно) при помощи malloc заполненную случайными числами /dev/urandom в 137 потоков. Используя системные средства мониторинга определите адрес начала в адресном пространстве процесса и характеристики выделенных участков памяти. Замеры виртуальной/физической памяти необходимо снять: До аллокации После аллокации После заполнения участка данными После деаллокации Записывает область памяти в файлы одинакового размера 49 мегабайт с использованием блочного обращения к диску. Размер блока ввода-вывода G байт. Последовательность записи/чтения блоков случайная


      • Я не прошу выполнить, помогите какими-то источниками, которые можно почитать

        • Елена Вставская
          Если честно, работать с такими огромными областями динамической памяти не приходилось. Предлагаю обратиться к автору задачи

  • Просто Ишак
    Уважаемая Елена Вставская, можете помочь случайно заблудшей душе на этот сайт ... пожалуйста :( Я только начал проходить эту тему и реально туплю ... Никак не могу разобраться с "методом открытия файла w+(перезапись и чтение)" в том плане что не получается сразу записать в файл и сразу считать из него. Вот в Вики нарыл что ... При открытом файле в режиме обновления ('+' в качестве второго или третьего символа аргумента обозначения режима) и ввод и вывод могут выполняться в ОДНОМ ПОТОКЕ. Тем не менее, запись не может следовать за чтением без промежуточного вызова fflush или функции позиционирования в файле (fseek, fsetpos или rewind), а чтение не может следовать за записью без промежуточного вызова функции позиционирования в файле.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Вот мой Кот -
    FILE *yk_file=fopen("test.txt", "w+");  // "w+" - перезапись и чтение
    // запись в файл
    fprintf(yk_file, "%d %d %d %d %d\n", 1, 2, 3, 4, 5);  // ЗАПИСАТЬ В ФАЙЛ "test.txt" через ПРОБЕЛЫ "1 2 3 4 5"

    // чтение из файла (почему то не работает)
    char ms[5]={};
    fscanf(yk_file, "%d %d", &ms[0], &ms[1]);  // чтение из файла "test.txt"
    printf("%d %d", ms[0], ms[1]);             // почему то не выводит 1 2

    fclose(yk_file); // ЗАКРЫТЬ файл

    • Елена Вставская
      Сейчас при считывании данных из файла указатель позиции в файле стоит в конце файла (после записи). Поэтому не работает считывание. Нужно перед считыванием передвинуть указатель (выполнить позиционирование)

  • Здравствуйте пишу простую программу с++,в постановке указано, что пользователь должен вводить числа с клавиатуры до ситуации конца файла. Пишу в линукс, с компилятором g++. В линукс ситуацию конца файла можно симулировать комбинацией клавиш ctrl+d. я использовал while(!cin.eof()) но приходится два раза нажимать ctrl+d. Не подскажите как с этим бороться.

  • Здраствуйте, я вот столкнулся с следующей проблемой, у меня такая задача: В текстовом файле, имя которого вводит пользователь, записан текст программы на языке Pascal. Надо удалить из программы все комментарии. Подсказка: в языке Pascal комментарии записываются в {}, но если следующий за {символ является знаком $, то это директива, а не комментарий. Как и в языке C, комментарий в Pascal-программе может занимать несколько строк. Скажите пожалуйста, как реализовать удаление коментариев, я думал посимвольно читать, но теперь заблуждаюсь даст ли это какие-то дивиденды, спасибо за ответ, хорошего дня)))


      • нет, сама программа по С, просто файл который обрабатываеться содержит текст с Паскалем)

      • Елена Вставская
        Проверить наличие двух идущих подряд символов {$ можно так:
        1
        2
        3
        4
        5
        6
        7
        8
        if(str[i]==&#039;{&#039; &amp;&amp; str[i+1]==&#039;$&#039;)
        {}// Директива
        else if(str[i]==&#039;{&#039;)
        {
          while(str[i]!=&#039;}&#039;)
            ;
        }
        else dst[j++]=str[i];

  • А еще такой вопрос, вот задание: В каждой строке текстового файла, имя которого вводит пользователь, записано выражение вида: число1  число2, где число1 и число2 - два произвольные целые числа,  - один из знаков Арифметических операций: +, -, * и / (перед знаком и за ним записан пробел). Надо дополнить строки результатам каждой операции и сохранить их в том же файле. Как можно решить данную задачу) Спасибо за ответ)

    • Елена Вставская
      К сожалению, вставить ответы между текстом не получится, по тому что при записи в файл с определенной позиции идет замена содержимого файла. Поэтому вариант решения - считать данные из файла, вычислить результат и заново записать в файл все данные.

  • Здраствуйте, скажите пожалуйста, как сделать дозапись в файл, просто открить его с помощью "а" и просто начать дозапись с консоли или как?) Спасибо за ответ)

    • Елена Вставская
      Да, открыть файл для добавления. Запись будет производиться в конец файла

  • Алексей
    Исправьте пожалуйста ошибки в соответствии заданию а то сам уже додуматься не могу. Програмно створити текстовий файл та внести необхідні дані. Організувати перегляд вмісту файлу і виконання дій відповідно до умови індивідуального завдання. Забезпечити збереження всіх отриманих результатів в новий файл.Дано файл f, компоненти якого є цілими числами. Отримати в файлі g всі компоненти файлу f є парними числами.
    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
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    int main(){
    FILE *f,*g;
    int a[6],i;
    randomize();
    for(i=0;i<6;i++){
      a[i]=random(20)-13;}
    char theName[]="file1.txt";
    f=fopen(theName,"w+");
    if(f==NULL){
      printf("fail %s nemozlivo vidkiti \n",theName);
      return -1;}
    for(i=0;i<6;i++){
      fprintf(f,"%d ",a[i]);}
    printf("Vmist failu %s\n",theName);
    int m[],n,p[],b;
    char Name[]="file2.txt";
    for(i=0;i<6;i++){
      n=fscanf("%d",&m[]);
      printf("\n%d ",m[]);}
    g=fopen(Name,"W+");
    for(i=0;i<6;i++){
      if(a[i]%2==0){
      fscanf(f,"%d",&p[]);
      fprintf(g,"%d ",p[]);
      b=fscanf("%d ",&p[]);
      printf("\n%d ",p[])}}
    fclose(f);
    fclose(g);
    getch();
    return 0;}

    • Елена Вставская
      Я не понимаю по-украински, и разобрать задание очень тяжело

      • Алексей
        Вот перевел задание Программно создать текстовый файл и внести необходимые данные. Организовать просмотр содержимого файла и выполнения действий согласно условию индивидуального задания. Обеспечить сохранность всех полученных результатов в новый файл.Дано файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f являются парными числами.

      • Алексей
        Вот текст програмы с
        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
        #include<stdio.h>
        #include<conio.h>
        #include<stdlib.h>
        int main(){
        FILE *f,*g;
        int a[6],i;
        randomize();
        for(i=0;i<6;i++){
          a[i]=random(20)-13;}
        char theName[]="file1.txt";
        f=fopen(theName,"w+");
        if(f==NULL){
          printf("fail %s невозможно открыть \n",theName);
          return -1;}
        for(i=0;i<6;i++){
          fprintf(f,"%d ",a[i]);}
        printf("Содержимое сайта %s:\n",theName);
        int m[],n,p[],b;
        char Name[]="file2.txt";
        for(i=0;i<6;i++){
          n=fscanf("%d",&m[]);
          printf("\n%d ",m[]);}
        g=fopen(Name,"W+");
        for(i=0;i<6;i++){
          if(a[i]%2==0){
          fscanf(f,"%d",&p[]);
          fprintf(g,"%d ",p[]);
          b=fscanf("%d ",&p[]);
          printf("\n%d ",p[])}}
        fclose(f);
        fclose(g);
        getch();
        return 0;}

        • Елена Вставская
          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>
          #include<stdlib.h>
          #include <time.h>
          int main() {
            FILE* f, * g;
            int N, *a, i;
            srand(time(NULL));
            printf("N= ");
            scanf("%d", &N);
            a = (int*)malloc(N * sizeof(int));
            for (i = 0; i < N; i++) {
              a[i] = rand()%20 - 13;
            }
            char theName[] = "file1.txt";
            f = fopen(theName, "w");
            if (f == NULL) {
              printf("fail %s невозможно открыть \n", theName);
              return -1;
            }
            for (i = 0; i < N; i++) {
              fprintf(f, "%d ", a[i]);
            }
            fclose(f);
            printf("File %s:\n", theName);
            f = fopen(theName, "r");
            char Name[] = "file2.txt";
            g = fopen(Name, "w");
            int m;
            while (fscanf(f, "%d", &m) != EOF)
            {
              printf("\n%d", m);
              if (m % 2 == 0)
              {
                fprintf(g, "%d\n", m);
              }
            }
            fclose(f);
            fclose(g);
            printf("\nDone");
            getchar();
            getchar();
            return 0;
          }

  • Здравствуйте, не подскажете, как написать программу, в которой из существующего файла считать каждый второй (чётный по порядку) символ и вывести на консоль? Масив не использовать.

    • Елена Вставская
      Считывайте посимвольно и увеличивайте счётчик. Если счётчик четный, выводить в консоль

  • Подскажите пожалуйста, как записать информацию в корневой каталог файловой системы FAT32? Проблема в том, что при записи через функцию WriteFile данные не записываются,а происходит отказ в доступе


  • Здравствуйте. У меня возникла проблема: каким образом можно удалить строку из файла, если я буду искать эту строку по ключевому слову(например, по фамилии)?

    • Елена Вставская
      Считать все данные из файла, удалить нужную строку и записать в файл заново.


      • Я имею в виду, есть ли такая функция удаления строки? Если же нет, то как можно самому такую написать?

        • Елена Вставская
          Функции такой нет. Считанные из файла строки будут представлять собой массив строк. В этом массиве нужно найти удаляемую строку и все строки, стоящие за ней, поднять на 1 позицию вверх. Потом перезаписать файл.

  • Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки ‘\n’, который включается в строку, или пока не наступит конец потока EOF или не будет прочитано максимальное символов. Здесь есть опечатка, не написано слово "количество" в конце, перед словом символов.

  • В первом примере кода вы забыли поставить строки: system("chcp 1251"); system("cls"); У меня без них вышла абракодабра - ═х єфрыюё№ юЄъЁ√Є№ Їрщы

  • Подскажите, а есть-ли в Си или С++ возможность копировать/переносить файлы из папки в папку как например с помощью xcopy? Спасибо

  • дмитрий
    здравствуйте, у меня такое задание: дан файл формата html нужно организовать программу реализующую алгоритм DOM задача партера построить дерево, мне данные сделать считываемые с клавиатуры ? или записать готовые сразу в файл и считывать оттуда? и каков смысл алгоритма DOM?

  • Владислав
    Добрый день. Скажите пожалуйста как посчитать количество чисел в файле перед заполнением массива из файла?

  • Алексей
    в файле input.dat находится список чисел перевести его в файл output. dat в обратном порядке

  • Здравствуйте, интересует воспроизведение звуковых файлов формата .wav и .mp3. Как можно это реализовать в программе? Или же есть какие-то стандартные звуковые команды типа Beep?

    • Елена Вставская
      Чтобы вывести звуковой сигнал, нужно напечатать символ с кодом 7. С воспроизведением звуковых файлов в C++ мне работать не приходилось :( Только в C#



      • Здравствуйте ,помогите пожалуйста : Дан символьный файл f, содержащий произвольный текст. Слова в тексте разделены пробелами и знаками препинания. Получить n наиболее часто встречающихся слов и число их появлений.

  • Здравствуйте, а как можно сделать составное название? К примеру, есть четыре вложенных цикла for вроде такого: https://pastebin.com/wTKVhj0L Как сделать так, чтобы программа создавала множество файлов с именами по типу "scale=30; amount=5; radius=3; claster_radius=6.txt"?

  • Владимир
    Хотелось бы по подробнее узнать о файловой системе FAT16 и MBR области. Я так понимаю первые два байта это безусловный переход на код загрузчика, затем один байт 0x90 какая то сигнатура, это тип файловой системы? Мне нужно написать программу которая создавала бы файл имитирующий данные диска в файловой системе FAT16. Очень важно знать с какого байта начинается таблица FAT, какие в ней данные, в какое место загрузочного сектора писать код загрузчика и в какое таблицу разделов и т.д.

    • Елена Вставская
      В Интернете есть информация на других сайтах. Кроме того, есть программа. WinHEX, которая позволяет исследовать структуру файловой системы носителя, с которым предстоит работать.

  • Александр
    Мне необходимо определение полного пути к файлу. Имеются ли в Си функции для этого (как например в Турбо Паскале)? Можно ли это сделать через GTK+ или как иначе?

    • Елена Вставская
      Что имеется в виду под определением полного пути к файлу? Для обращения к файлу, который находится в другой папке, чем программа, Вы можете указать строку с его полным именем:
      1
      2
      char filename[]="C:\Folder\file.txt"//<имя> файла
      FILE *fp = fopen (filename, "r");

      • Александр
        Меня интересует ни чтение/запись данных на диск, а работа с поиском файлов и каталогов.


  • Помогите .пожалуйста. сделать программу. Даны текстовые файлы f1 и f2. Переписать с сохранением порядка следования компоненты файла f1 в файл f2, а компоненты файла f2 в файл f1. Использовать вспомогательный файл h.

    • Елена Вставская
      Сначала переписать содержимое одного файла (f1) во вспомогательный файл. Затем содержимое f2 перезаписать в f1. А потом содержимое вспомогательного файла сохранить в f2.

  • Створити дві програми. Перша дозволяє користувачу ввести будь-яке число і записати його у файл. Друга програма зчитує дані з файлу, виводить їх на екран та виводить послідовність Фібіоначчі з кількістю символів, що відповідає даному зчитаному числу. Скласти блок-схему алгоритмів роботи обох програм

    • Елена Вставская
      К сожалению, я не знаю украинский, поэтому составить блок-схему на украинском не смогу.


    • Елена Вставская
      Эти две строки используются для корректного отображения русских символов в консоли. Подробнее описано здесь.

    • Игорь Шапошников
      1
      2
      3
      4
      #include <stdlib.h>
      ...
      system("chcp 1251"); //кодировка
      system("cls"); //очистка всего текста что было перед system("cls");

      • Да можно проще system("@chcp 1251>nul"); Не помню прописывает ли программа команды прежде, чем выполнить, потому "@". А всё, что команда попытается вывести отправится в чистилище (nul) ;))


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *