Найти строчку в файле - C (СИ)
Формулировка задачи:
Привожу полный текст программы
Функция mission(). Проблема в ней, а именно в поиске данных в файле. Я пытаюсь в цикле while выполнить fread столько раз, сколько строк в файле, но дело в том, что он выполняет его 1 раз. Я думаю дело все в том, что я не правильно указываю параметры fread. Помогите.
P. S. Задание для учебы звучит так
Конкретно меня интересует фраза выделенная жирным шрифтом. Я понял, что режим rb+ - это и есть режим прямого доступа. Даже не так, а - это режим ... Я даже не знаю как это сказать. Правильно ли я думаю? Правильный режим для работы я выбрал? Что за режим прямого доступа?
#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; }
Задание 1. Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию
и, применяя режим прямого доступа, выполнить задание по своему варианту
. Структура имеет вид: название вуза, число студентов, количество факультетов. Добавить в конец файла информацию о трех новых вузах и посчитать общее число студентов.Решение задачи: «Найти строчку в файле»
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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д