1

Тема: Робота з файлами на С

Завдання таке:
Задано файл з текстом С-програми. Виділити і переписати у новий файл з
іменем main-fun.c функцію main() з цієї програми. Підказка: пошук кінця функції
доцільно виконати через перевірку балансу фігурних дужок {}

Я щось трохи зробила, але десь напартачила *SCRATCH* :[  , бо виводиться купа букв "М" і тільки оце "const char* find1 = "int main()", * find2 = "int main(int argc, char** argv))"; "

Буду дуже рада допомозі, заздалегідь дякую за кожну відповідь)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#define MAXN 300
#define LENG 60
#define ROWS 100

int main(void) {
    system("chcp 1251");
    FILE* fp, * fc;
    int n = 0, i = 0, count1 = 0, count2 = 0;

    const char* fname = "D:\\Study_projects\\program4lab7.cpp";
    const char* fmain = "D:\\Study_projects\\main-fun.cpp";
    const char* find1 = "int main()", * find2 = "int main(int argc, char** argv))";

    char buf[MAXN], string[ROWS][LENG];
    fp = fopen(fname, "rt");
    fc = fopen(fmain, "wt+");
    while (fgets(buf, MAXN, fp) != NULL) {
        if ((strstr(buf, find1) != NULL) || (strstr(buf, find2) != NULL)) {             
                if (buf == "{") {
                    count1++;
                }
                if (buf == "}") {
                    count2++;
                }
                while (count1 != count2) {
                    for (int і = 0; buf[і] != '\0'; і++)                    
                         string[n][i] = buf[i];
                }
           
        fputs(string[n], fc);
        n++;
        }
    }
    fclose(fp);
    fclose(fc);
    fc = fopen(fmain, "rt+");
    while (fgets(buf, ROWS, fc) != NULL)
        fputs(buf, stdout);
    fclose(fc);
    return 0;
}

Можливо десь і не догледіла, але ніяк не зрозумію(

2

Re: Робота з файлами на С

Ви читаєте файл по рядках, а потім працюєте лише з тим рядком, в якому буде зустрічатися "int main()". В наступному цього вже не буде, перевірка дасть false і більше нічого в string не скопіюється. Крім того, buf=="}" буде завжди false, бо стрічки оператором == не порівнюються.
Вам треба, щойно ви зустріли перший рядок функції, почати копіювати символи і лічити в них дужки. Щойно дужки закінчаться - перестати копіювати.

Подякували: Dmy, sofiiitake2

3

Re: Робота з файлами на С

Дякую, я це вже зрозуміла, тільки от як правильно зробити у коді зустріч int main(), щоб надалі працювати з наступними рядками?

4 Востаннє редагувалося koala (27.04.2022 11:00:27)

Re: Робота з файлами на С

Просто зробіть два цикли послідовно: спершу до зустрічі, потім - до останньої дужки.

Подякували: sofiiitake1