Задание 5 - Работа с файлами (лабораторная по Си)

Лабораторная работа для школ и вузов по решению задач по работе с файлами на языке C (Си). Перечень задач лабораторной работы (клик по ссылке направляет на решение задачи, если таковое имеется):

  1. Распечатать все строки данного файла, содержащие заданную строку в качестве подстроки. Строка запрашивается у пользователя.
  2. Определить, какой символ чаще других встречается в данном файле.
  3. Определить, сколько строк, состоящих из одного, двух, трех и т.д. символов, содержится в данном файле. Считать, что длина каждой строки – не более 30 символов. Имя файла задает пользователь.
  4. Даны два непустых файла. Определить номер строки и номер первого символа в этой строке, отличающего содержимое одного файла от другого. Если содержимое файлов полностью совпадает или один файл является началом другого, то вывести соответствующие сообщения.
  5. В файле записана непустая последовательность целых чисел (целое число – это последовательность десятичных цифр, возможно начинающаяся знаком + или -). Определить, сколько четных положительных чисел содержится в файле.
  6. Создать файл, являющийся результатом конкатенации (слияния) других файлов. Имя файла-результата и имена соединяемых файлов задаются пользователем.
  7. Дан файл f. Создать файл newf, полученный из файла f заменой всех его прописных букв соответствующими строчными.
  8. Дан файл и две строки. Все вхождения первой строки в файл (в том числе в качестве подстроки) заменить второй строкой.
  9. В данном файле символы каждой строки упорядочить по алфавиту.
  10. В файле записана непустая последовательность целых чисел (целое число – это последовательность десятичных цифр, начинающаяся знаком + или -). Создать новый файл, где все отрицательные числа заменены нулем.
  11. В файле записана непустая последовательность целых чисел, являющихся числами Фибоначчи. Приписать еще n чисел Фибоначчи. Число n спросить у пользователя (предварительно сообщив, сколько чисел уже имеется в файле).
  12. В файле подсчитать количество строк, которые начинаются и оканчиваются один и тем же символом.
  13. Считая, что файл разбит на строки, длина каждой из которых не превосходит 50 символов, написать программу, которая, дополняя короткие строки исходного файла пробелами справа, формирует новый файл, все строки в котором имеют длину 50.
  14. Написать программу, которая, игнорируя исходное деление файла на строки, переформатирует его, разбивая строки так, чтобы каждая строка оканчивалась точкой, либо содержала ровно 60 литер, если среди них нет точки. Результат записать в другой файл.
  15. В файле записаны числа. Создать новый файл, содержащий длины всех убывающих подпоследовательностей элементов исходного файла (длина – количество элементов в последовательности). Напр., исходный файл 1.7 4.5 3.4 2.2 8.5 1.2, результат – 3 2, где 3 – длина последовательности 4.5 3.4 2.2, а 2 - длина последовательности 8.5 1.2.
  16. Даны три файла разного размера (имена файлов вводит пользователь). Заменить содержимое самого длинного файла на содержимое самого короткого.
  17. Даны два файла, содержащие элементы прямоугольных матриц (по строкам), причем первый элемент каждого файла содержит количество столбцов соответствующей матрицы. То есть файл имеет вид:
    kolvo_stolb
    a11 a12 a13…
    a21 a22 a23…
    Создать новый файл, содержащий произведение этих матриц.
  18. В файле содержится ненулевая часть верхнетреугольной матрицы (вид содержимого файла – как в задаче 17). Создать новый файл, содержащий все элементы данной матрицы (по строкам).
  19. Имеются два файла (размеры файлов могут не совпадать). Переписать элементы первого файла во второй, второго – в первый. Использовать вспомогательный файл.
  20. Определить, какая строка является самой длинной в заданном файле.
  21. В файле записана непустая последовательность целых чисел. Определить, сколько чисел этой последовательности являются точными квадратами, и «подчеркнуть» их в данном файле (т.е. поставить минусы в соответствующих позициях следующей строки).

Работоспособность всех программ проверена в CodeBlocks 16.01 (MinGW, Windows 10). Свои решения нерешённых программ и пожелания по улучшению существующих можете давать в комментариях внизу страницы.

Скачать файл лабораторной и все исходные коды программ в архиве:



№1: Распечатать все строки данного файла, содержащие заданную строку в качестве подстроки. Строка запрашивается у пользователя.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE* txt;
    char strtxt[80], str[80];
    int i = 0;
    if (!(txt = fopen("test.txt", "r"))){
        printf("Error opening file!");
        return 0;
    }
    printf("Enter the string:\n");
    gets(str);
    printf("Line with this substring:\n");
    while (fgets(strtxt, 80, txt)){
        i++;
        if (strstr(strtxt, str))
            printf("%d | %s", i, strtxt);
    }
    fclose(txt);
    return 0;
}

№9: В данном файле символы каждой строки упорядочить по алфавиту.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE* txt;
    char strtxt[80][80], d[1];
    int i, j, k, count = 0, len, max = 0;
    if (!(txt = fopen("test.txt", "r"))){
        printf("Error opening file!");
        return 0;
    }
    while (fgets(strtxt[count], 80, txt))
        count++;
    fclose(txt);
    txt = fopen("test.txt", "w");
    for (k = 0; k < count; k++) {
        len = strlen(strtxt[k]) - 1;
        for (i = 0; i < len; i++){
            for (j = 0; j < len-i; j++)
                if ((int)strtxt[k][j] > (int)strtxt[k][max])
                    max = j;
            d[0] = strtxt[k][max];
            strtxt[k][max] = strtxt[k][len-i-1];
            strtxt[k][len-i-1] = d[0];
            max = 0;
        }
        fputs(strtxt[k], txt);
    }
    printf("OK!");
    fclose(txt);
    return 0;
}

№12: В файле подсчитать количество строк, которые начинаются и оканчиваются один и тем же символом.

#include <stdio.h>

int main()
{
    FILE* txt;
    char strtxt[80];
    int count = 0;
    if (!(txt = fopen("test.txt", "r+"))){
        printf("Error opening file!");
        return 0;
    }
    while (fgets(strtxt, 80, txt))
        if (strtxt[0] == strtxt[strlen(strtxt)-2])
            count++;
    printf("Number of lines: %d", count);
    fclose(txt);
    return 0;
}

№16: Даны три файла разного размера (имена файлов вводит пользователь). Заменить содержимое самого длинного файла на содержимое самого короткого.

#include <stdio.h>

int main()
{
    FILE *txt1, *txt2, *txt3, *txtB, *txtM;
    char strtxt[80], str1[80], str2[80], str3[80];
    int count1 = 0, count2 = 0, count3 = 0;
    printf("Enter the file name 1:\n");
    gets(str1);
    printf("Enter the file name 2:\n");
    gets(str2);
    printf("Enter the file name 3:\n");
    gets(str3);
    if (!(txt1 = fopen(str1, "r"))){
        printf("Error opening file 1!");
        return 0;
    }
    if (!(txt2 = fopen(str2, "r"))){
        printf("Error opening file 2!");
        return 0;
    }
    if (!(txt3 = fopen(str3, "r"))){
        printf("Error opening file 3!");
        return 0;
    }
    while (fgetc(txt1) != EOF)
        count1++;
    while (fgetc(txt2) != EOF)
        count2++;
    while (fgetc(txt3) != EOF)
        count3++;
    fclose(txt1);
    fclose(txt2);
    fclose(txt3);
    if (count1 < count2 && count1 < count3) {
        txtB = fopen(str1, "r");
        if (count2 < count3)
            txtM = fopen(str3, "w");
        else
            txtM = fopen(str2, "w");
    } else if (count2 < count1 && count2 < count3) {
        txtB = fopen(str2, "r");
        if (count1 < count3)
            txtM = fopen(str3, "w");
        else
            txtM = fopen(str1, "w");
    } else if (count3 < count1 && count3 < count2) {
        txtB = fopen(str3, "r");
        if (count1 < count2)
            txtM = fopen(str2, "w");
        else
            txtM = fopen(str1, "w");
    }
    while (fgets(strtxt, 80, txtB))
        fputs(strtxt, txtM);
    fclose(txtB);
    fclose(txtM);
    printf("OK!");
    return 0;
}

№19: Имеются два файла (размеры файлов могут не совпадать). Переписать элементы первого файла во второй, второго – в первый. Использовать вспомогательный файл.

#include <stdio.h>

int main()
{
    FILE* txt1, *txtP, *txt2;
    char strtxt[80];
    if (!(txt1 = fopen("test1.txt", "r"))){
        printf("Error opening file 1!");
        return 0;
    }
    if (!(txtP = fopen("testP.txt", "w"))){
        printf("Error creating intermediate file!");
        return 0;
    }
    if (!(txt2 = fopen("test2.txt", "r"))){
        printf("Error opening file 2!");
        return 0;
    }
    while (fgets(strtxt, 80, txt1))
        fputs(strtxt, txtP);
    fclose(txt1);
    fclose(txtP);
    txt1 = fopen("test1.txt", "w");
    while (fgets(strtxt, 80, txt2))
        fputs(strtxt, txt1);
    fclose(txt1);
    fclose(txt2);
    txtP = fopen("testP.txt", "r");
    txt2 = fopen("test2.txt", "w");
    while (fgets(strtxt, 80, txtP))
        fputs(strtxt, txt2);
    fclose(txtP);
    fclose(txt2);
    printf("OK!");
    return 0;
}

№20: Определить, какая строка является самой длинной в заданном файле.

#include <stdio.h>

int main()
{
    FILE* txt;
    char strtxt[80];
    int i = 0, max = 0, maxLen = 0;
    if (!(txt = fopen("test.txt", "r+"))){
        printf("Error opening file!");
        return 0;
    }
    while (fgets(strtxt, 80, txt)){
        if (strlen(strtxt) > maxLen) {
            maxLen = strlen(strtxt);
            max = i+1;
        }
        i++;
    }
    printf("The longest line: %d", max);
    fclose(txt);
    return 0;
}



Реклама

Поддержать