Найти строчку в файле - 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;
}