Найти строчку в файле - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привожу полный текст программы
#include <stdio.h> // Заголовочный файл для организации ввода-вывода 
#include <math.h> // Заголовочный файл математических функций 
#include <conio.h> // Для задержки экрана
#include <locale.h> // Для корректного отображения русской киррилицы в CMD 
#include <string.h> // Для работы с нуль-терминированными строками и различными функциями работы с памятью. (strcat)
 
struct data
{
    char high_school[255];
    int students;
    int faculties;
} hSchoolsK, p;

createFile() {
    char fileName[255], ans;
    int iAns, j;
    FILE *nf;
    // Объявление структуры high schools. Тестовые данные
    struct data hSchools[10] = {
        { "Калифорнийский технологический институт",2141,40 },
        { "Оксфордский университет",1846,18 },
        { "Стэнфордский университет",1425,25 },
        { "Кембриджский университет",1356,15 },
        { "Массачусетский технологический институт",2063,21 },
        { "Гарвардский университет",2147,32 },
        { "Принстонский университет",2065,71 },
        { "Имперский колледж Лондона",1985,35 },
        { "Швейцарский федеральный технологический институт в Цюрихе",1632,21 },
        { "Чикагский университет",1954,15 }
    };

    printf("\n Создание нового файла.");
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ ФАЙЛ С ТАКИМ ИМЕНЕМ УЖЕ СУЩЕСТВУЕТ - ОН БУДЕТ СТЕРТ. ПРОДОЛЖИТЬ? y/n:");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Операция создания файла отменена...");
        return 0;
    }
    else {
        j = 0;
        nf = fopen(fileName, "w");
        printf("\n Файл %s создан. Действия с файлом:", fileName);
        printf("\n 1. Заполнить файл тестовыми данными");
        printf("\n 2. Ввести данные с клавиатуры");
        printf("\n 3. Закрыть файл");
        printf("\n \n Ожидание ввода комманды:");
        scanf_s("%d", &iAns);
        switch (iAns)
        {
        case 1:
            for (j = 0; j < 10; j++) {
                fprintf(nf, "%s %d %d\n", &hSchools[j].high_school, hSchools[j].students, hSchools[j].faculties);
            }
            fclose(nf);
            printf("\n Заполнение файла завершено. Добавлено %d записей. Файл %s закрыт", j, fileName);
            break;
        case 2:
            do {
                j++;
                printf("\n Введите название вуза:");
                scanf_s("%s", &hSchoolsK.high_school, 255);
                //printf("\n Название вуза = %s", hSchoolsK.high_school);
                printf("\n Введите количество студентов:");
                scanf_s("%d", &hSchoolsK.students);
                printf("\n Введите количество факультетов:");
                scanf_s("%d", &hSchoolsK.faculties);
                fprintf(nf, "%s %d %d\n", &hSchoolsK.high_school, hSchoolsK.students, hSchoolsK.faculties);
                //fwrite(&hSchoolsK, sizeof(hSchoolsK), 1, nf);
                printf("\n Количество добавленных записей в файле = %d. Закончить? ", j);
                ans = _getch();
            } while (ans!='y');
            fclose(nf);
            printf("\n Редактирование файла завершено. Файл %s закрыт", fileName);
            break;
        case 3:
            fclose(nf);
            printf("\n Файл %s закрыт", fileName);
            break;
        default:
            printf("\n Команда не распознана. Файл будет закрыт.");
            fclose(nf);
            break;
        }
        return 0;
    }
}
 
openFile() {
    char fileName[255], ans;
    int iAns, j;
    FILE *nf;
    /*struct hSchoolsK
    {
        char high_school[255];
        int students;
        int faculties;
    } hSchoolsK;*/
 
    printf("\n Открытие файла.");
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ ФАЙЛА С ТАКИМ ИМЕНЕМ НЕ СУЩЕСТВУЕТ - ОН БУДЕТ СОЗДАН. ПРОДОЛЖИТЬ? y/n:");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Открытие файла отменено...");
        return 0;
    }
    else {
        nf = fopen(fileName, "a+");
        printf("\n Файл %s открыт. Содержимое файла:\n", fileName);
        while (EOF != (j = getc(nf)))
        {
            putchar(j);
        }
        printf("\n --------------------------------------------- \n Действия с файлом:");
        printf("\n 1. Добавить записи в файл");
        printf("\n 2. Закрыть файл \n");
        scanf_s("%d", &iAns);
        switch (iAns)
        {
        case 1:
            j = 0;
            do {
                j++;
                printf("\n Введите название вуза:");
                scanf_s("%s", &hSchoolsK.high_school, 255);
                //printf("\n Название вуза = %s", hSchoolsK.high_school);
                printf("\n Введите количество студентов:");
                scanf_s("%d", &hSchoolsK.students);
                printf("\n Введите количество факультетов:");
                scanf_s("%d", &hSchoolsK.faculties);
                fprintf(nf, "\n%s %d %d", &hSchoolsK.high_school, hSchoolsK.students, hSchoolsK.faculties);
                //fwrite(&hSchoolsK, sizeof(hSchoolsK), 1, nf);
                printf("\n Количество добавленных записей в файле = %d. Закончить? ", j);
                ans = _getch();
            } while (ans != 'y');
            printf("\n Файл %s изменен. Содержимое файла:\n", fileName);
            rewind(nf);
            while (EOF != (j = getc(nf)))
            {
                putchar(j);
            }
            printf("\n --------------------------------------------- \n");
            fclose(nf);
            printf("\n Файл %s закрыт", fileName);
            break;
        case 2:
            fclose(nf);
            printf("\n Файл %s закрыт", fileName);
            break;
        default:
            printf("\n Команда не распознана. Файл будет закрыт.");
            fclose(nf);
            break;
        }
        return 0;
    }
}
 
deleteFile() {
    char fileName[255], ans;
 
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ УДАЛЯЕТСЯ КАТАЛОГ, ОН ДОЛЖЕН БЫТЬ ПУСТЫМ. ПРОДОЛЖИТЬ? y/n:\n");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Удаление файла отменено...");
        return 0;
    }
    else {
        printf("Удаление файла : ");
        // Удаление файла
        if (-1 == remove(fileName))
            printf("Ошибка\n");
        else
            printf("Выполнено\n");
        return 0;
    }
}
 
mission() {
    char fileName[255], ans;
    int i, j, n;
    FILE *nf;
 
    printf("\n Открытие файла.");
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ ФАЙЛА С ТАКИМ ИМЕНЕМ НЕ СУЩЕСТВУЕТ - ОН БУДЕТ СОЗДАН. ПРОДОЛЖИТЬ? y/n:");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Открытие файла отменено...");
        return 0;
    }
    else {
        nf = fopen(fileName, "rb+");
        n = 0;
        fseek(nf, 0, SEEK_END);
        printf("\n Указатель на = %d", ftell(nf));
        do {
            n++;
            printf("\n Введите название вуза:");
            scanf_s("%s", &hSchoolsK.high_school, 255);
            //printf("\n Название вуза = %s", hSchoolsK.high_school);
            printf("\n Введите количество студентов:");
            scanf_s("%d", &hSchoolsK.students);
            printf("\n Введите количество факультетов:");
            scanf_s("%d", &hSchoolsK.faculties);
            fprintf(nf, "\r\n%s %d %d", &hSchoolsK.high_school, hSchoolsK.students, hSchoolsK.faculties);
            //fwrite(&hSchoolsK, sizeof(hSchoolsK), 1, nf);
            printf("\n Количество добавленных записей в файле = %d. \n", n);
        } while (n != 3);
        rewind(nf);
        i=0;
        //fread(&p, sizeof(p), 1, nf);
        while (!feof(nf)) {
            fread(&p, sizeof(p), 1, nf);
            i++;
        }
        /*while (!feof(nf))
        {
            if (fgetc(nf) == '\n')
                n++;
        }
        n++;
        */
        printf("\r\n%d", i);
        fclose(nf);
        printf("\n Редактирование файла завершено. Файл %s закрыт", fileName);
    }
}
 
main() {
    setlocale(LC_ALL, "RUS"); // Для корректного отображения русской киррилицы в CMD
    
    // Объявление переменных
    int c;
    
    printf("\n Меню:");
    printf("\n 1. Создать файл");
    printf("\n 2. Открыть файл для просмотра и/или изменения");
    printf("\n 3. Выполнить задание по своему варианту");
    printf("\n 4. Удалить файл");
    printf("\n \n Ожидание ввода комманды:");
    scanf_s("\n%d", &c);
 
    switch (c)
    {
    case 1:
        createFile();
        break;
    case 2:
        openFile();
        break;
    case 3:
        mission();
        break;
    case 4:
        deleteFile();
        break;
    default:
        printf("\n Команда не распознана. Введите ее еще раз. (Только номер. Пример: 3)");
        break;
    }
 
    /*printf("\n Общая информация по школам:");
    for (i = 0; i < 5; i++) {
        printf("\n Школа №%d: , Отчетный год: %d, Выпускников: %d, Поступивших в ВУЗы: %d", s[i].School, s[i].year, s[i].graduates, s[i].students);
        graduates += s[i].graduates;
        students += s[i].students;
    }
 
    printf("\n Общее количество выпускников = %d.", graduates);
    printf("\n Доля поступивших в ВУЗ = %7.2f.", (float)graduates / 100 * students);
    */
    _getch(); // Задержка экрана
    return 0;
}
Функция mission(). Проблема в ней, а именно в поиске данных в файле. Я пытаюсь в цикле while выполнить fread столько раз, сколько строк в файле, но дело в том, что он выполняет его 1 раз. Я думаю дело все в том, что я не правильно указываю параметры fread. Помогите. P. S. Задание для учебы звучит так
Задание 1. Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию

и, применяя режим прямого доступа, выполнить задание по своему варианту

. Структура имеет вид: название вуза, число студентов, количество факультетов. Добавить в конец файла информацию о трех новых вузах и посчитать общее число студентов.
Конкретно меня интересует фраза выделенная жирным шрифтом. Я понял, что режим rb+ - это и есть режим прямого доступа. Даже не так, а - это режим ... Я даже не знаю как это сказать. Правильно ли я думаю? Правильный режим для работы я выбрал? Что за режим прямого доступа?

Решение задачи: «Найти строчку в файле»

textual
Листинг программы
#include <stdio.h> // Заголовочный файл для организации ввода-вывода 
#include <math.h> // Заголовочный файл математических функций 
#include <conio.h> // Для задержки экрана
#include <locale.h> // Для корректного отображения русской киррилицы в CMD 
#include <string.h> // Для работы с нуль-терминированными строками и различными функциями работы с памятью. (strcat)
 
struct data
{
    char high_school[255];
    int students;
    int faculties;
} hSchoolsK, p;
 
 
createFile() {
    char fileName[255], ans;
    int iAns, j;
    FILE *nf;
    // Объявление структуры high schools. Тестовые данные
    struct data hSchools[10] = {
        { "Калифорнийский технологический институт",2141,40 },
        { "Оксфордский университет",1846,18 },
        { "Стэнфордский университет",1425,25 },
        { "Кембриджский университет",1356,15 },
        { "Массачусетский технологический институт",2063,21 },
        { "Гарвардский университет",2147,32 },
        { "Принстонский университет",2065,71 },
        { "Имперский колледж Лондона",1985,35 },
        { "Швейцарский федеральный технологический институт в Цюрихе",1632,21 },
        { "Чикагский университет",1954,15 }
    };
    
 
    printf("\n Создание нового файла.");
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ ФАЙЛ С ТАКИМ ИМЕНЕМ УЖЕ СУЩЕСТВУЕТ - ОН БУДЕТ СТЕРТ. ПРОДОЛЖИТЬ? y/n:");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Операция создания файла отменена...");
        return 0;
    }
    else {
        j = 0;
        nf = fopen(fileName, "w");
        printf("\n Файл %s создан. Действия с файлом:", fileName);
        printf("\n 1. Заполнить файл тестовыми данными");
        printf("\n 2. Ввести данные с клавиатуры");
        printf("\n 3. Закрыть файл");
        printf("\n \n Ожидание ввода комманды:");
        scanf_s("%d", &iAns);
        switch (iAns)
        {
        case 1:
            fwrite(&hSchools, sizeof(hSchools), 1, nf);
            fclose(nf);
            printf("\n Заполнение файла завершено. Добавлено 10 записей. Файл %s закрыт", fileName);
            break;
        case 2:
            do {
                j++;
                printf("\n Введите название вуза:");
                scanf_s("%s", &hSchoolsK.high_school, 255);
                printf("\n Введите количество студентов:");
                scanf_s("%d", &hSchoolsK.students);
                printf("\n Введите количество факультетов:");
                scanf_s("%d", &hSchoolsK.faculties);
                fwrite(&hSchoolsK, sizeof(hSchoolsK), 1, nf);
                printf("\n Количество добавленных записей в файле = %d. Закончить? ", j);
                ans = _getch();
            } while (ans!='y');
            fclose(nf);
            printf("\n Редактирование файла завершено. Файл %s закрыт", fileName);
            break;
        case 3:
            fclose(nf);
            printf("\n Файл %s закрыт", fileName);
            break;
        default:
            printf("\n Команда не распознана. Файл будет закрыт.");
            fclose(nf);
            break;
        }
        return 0;
    }
}
 
openFile() {
    char fileName[255], ans;
    int iAns, i, n, j;
    FILE *nf;
    printf("\n Открытие файла.");
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ ФАЙЛА С ТАКИМ ИМЕНЕМ НЕ СУЩЕСТВУЕТ - ОН БУДЕТ СОЗДАН. ПРОДОЛЖИТЬ? y/n:");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Открытие файла отменено...");
        return 0;
    }
    else {
        nf = fopen(fileName, "ab+");
        printf("\n Файл %s открыт. Содержимое файла:\n", fileName);
        fseek(nf, 0, SEEK_END);
        n = ftell(nf) / sizeof(p);
        rewind(nf);
        for (i = 0; i < n; i++) {
            fread(&p, sizeof(p), 1, nf);
            printf("%s %d %d\n", p.high_school, p.students, p.faculties);
        }
        printf("\n --------------------------------------------- \n Действия с файлом:");
        printf("\n 1. Добавить записи в файл");
        printf("\n 2. Закрыть файл \n");
        scanf_s("%d", &iAns);
        switch (iAns)
        {
        case 1:
            j = 0;
            rewind(nf);
            do {
                j++;
                printf("\n Введите название вуза:");
                scanf_s("%s", &hSchoolsK.high_school, 255);
                printf("\n Введите количество студентов:");
                scanf_s("%d", &hSchoolsK.students);
                printf("\n Введите количество факультетов:");
                scanf_s("%d", &hSchoolsK.faculties);
                fwrite(&hSchoolsK, sizeof(hSchoolsK), 1, nf);
                printf("\n Количество добавленных записей в файле = %d. Закончить? ", j);
                ans = _getch();
            } while (ans != 'y');
            printf("\n Файл %s изменен. Содержимое файла:\n", fileName);
            fseek(nf, 0, SEEK_END);
            n = ftell(nf) / sizeof(p);
            rewind(nf);
            for (i = 0; i < n; i++) {
                fread(&p, sizeof(p), 1, nf);
                printf("%s %d %d\n", p.high_school, p.students, p.faculties);
            }
            printf("\n --------------------------------------------- \n");
            fclose(nf);
            printf("\n Файл %s закрыт", fileName);
            break;
        case 2:
            fclose(nf);
            printf("\n Файл %s закрыт", fileName);
            break;
        default:
            printf("\n Команда не распознана. Файл будет закрыт.");
            fclose(nf);
            break;
        }
        return 0;
    }
}
 
deleteFile() {
    char fileName[255], ans;
 
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ УДАЛЯЕТСЯ КАТАЛОГ, ОН ДОЛЖЕН БЫТЬ ПУСТЫМ. ПРОДОЛЖИТЬ? y/n:\n");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Удаление файла отменено...");
        return 0;
    }
    else {
        printf("Удаление файла : ");
        // Удаление файла
        if (-1 == remove(fileName))
            printf("Ошибка\n");
        else
            printf("Выполнено\n");
        return 0;
    }
}
 
mission() {
    char fileName[255], ans;
    int i, j, n;
    FILE *nf;
 
    printf("\n Открытие файла.");
    printf("\n Введите имя файла:");
    scanf_s("%s", &fileName, 255);
    strcat(fileName, ".txt");
    printf("\n ВНИМАНИЕ! ЕСЛИ ФАЙЛА С ТАКИМ ИМЕНЕМ НЕ СУЩЕСТВУЕТ - ОН БУДЕТ СОЗДАН. ПРОДОЛЖИТЬ? y/n:");
    ans = _getch();
    if (ans == 'n') {
        printf("\n Открытие файла отменено...");
        return 0;
    }
    else {
        nf = fopen(fileName, "rb+");
        n = 0; j = 0;
        fseek(nf, 0, SEEK_END);
        do {
            n++;
            printf("\n Введите название вуза:");
            scanf_s("%s", &hSchoolsK.high_school, 255);
            printf("\n Введите количество студентов:");
            scanf_s("%d", &hSchoolsK.students);
            printf("\n Введите количество факультетов:");
            scanf_s("%d", &hSchoolsK.faculties);
            fwrite(&hSchoolsK, sizeof(hSchoolsK), 1, nf);
            printf("\n Количество добавленных записей в файле = %d. \n", n);
        } while (n != 3);
        fseek(nf, 0, SEEK_END);
        n = ftell(nf) / sizeof(p);
        rewind(nf);
        for (i = 0; i < n; i++) {
            fread(&p, sizeof(p), 1, nf);
            j += p.students;
        }
        printf("\r\n Общее количество студентов = %d", j);
        fclose(nf);
        printf("\n Редактирование файла завершено. Файл %s закрыт", fileName);
    }
    return 0;
}
 
main() {
    setlocale(LC_ALL, "RUS"); // Для корректного отображения русской киррилицы в CMD
    
    // Объявление переменных
    int c;
    
    printf("\n Меню:");
    printf("\n 1. Создать файл");
    printf("\n 2. Открыть файл для просмотра и/или изменения");
    printf("\n 3. Выполнить задание по своему варианту");
    printf("\n 4. Удалить файл");
    printf("\n \n Ожидание ввода комманды:");
    scanf_s("\n%d", &c);
 
    switch (c)
    {
    case 1:
        createFile();
        break;
    case 2:
        openFile();
        break;
    case 3:
        mission();
        break;
    case 4:
        deleteFile();
        break;
    default:
        printf("\n Команда не распознана. Введите ее еще раз. (Только номер. Пример: 3)");
        break;
    }
    _getch(); // Задержка экрана
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы