Беда с файлами в С++
Завтра сдавать последнюю работу практики и есть проблема. Билась с эти неделю, но так и не поняла,что не так. Код:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <vcl.h>
struct task {
string prizv, group, mark;
};
task x[100];
FILE *f, *F1;
void create(void) {
if ((f=fopen("xx.dat", "w"))==NULL)
{perror("Файл уже создан");
getch();
exit(1);}
const int n=10;
for (int i = 0; i <n;i++) {
cout << "Фамилия ученика" << endl;
cin >> x[i].prizv;
cout << "Группа ученика" << endl;
cin >> x[i].group;
cout << "Оценки" << endl;
cin >> x[i].mark;
}
for (int i = 0; i < n; i++) {
cout << x[i].prizv << " " << x[i].group << " " << x[i].mark << " " << endl;
}
fwrite(&x,sizeof(x),1,f);
fclose(f);
}
void watch(void) {
if ((f=fopen("xx.dat", "r"))==NULL)
{perror("Нет файла");
getch();
exit(1);}
int n = 0;
while(fread(&x,sizeof(x),1,f)!=NULL) {
cin >> x[n].prizv;
cin >> x[n].group;
cin >> x[n].mark;
n++;
}
for (int i = 0; i < n-1; i++) {
cout << "Фамилия ученика: " << endl;
cin >> x[i].prizv;
cout << "Группа ученика: " << endl;
cin >> x[i].group;
cout << "Оценки: " << endl;
cin >> x[i].mark;
cout << "\n";
getch();
}
fclose(f);
}
void add(void) {
if ((f=fopen("xx.dat", "a"))==NULL)
{perror("Файл уже есть");
getch();
exit(1);}
int n;
n = 0;
while (fread(&x,sizeof(x),1,f)!=NULL) {
cin >> x[n].prizv;
cin>> x[n].group;
cin >> x[n].mark;
n++;
n--;
for (int i = 0; i < n; i++){cout << "Фамилия: " << endl;
cin >> x[i].prizv;
cout << "Группа: " << endl;
cin >> x[i].group;
cout << "Оценки: " << endl;
cin >> x[i].mark;
n++; }
fwrite(&x,sizeof(x),1,f);
for (int i = 0; i < n; i++) {
cout << x[i].prizv << " " << x[i].group << " " << x[i].mark << " " << endl;
}
fclose(f);
}
int find()
{if ((f=fopen("xx.dat", "r"))==NULL)
{perror("Нет файла");
getch();
exit(1);}
int n
n = 0;
while (fread(&x,sizeof(x),1,f)!=NULL) {
cin >> x[n].prizv;
cin >> x[n].group;
cin >> x[n].mark;
n++;
}
fclose(f);
for (int i = 0; i < n-1; i++) {
if (n[i].mark == "2") {
cout << i + 1 << "Фамилия: " << endl;
cout << x[i].prizv << endl;
cout << "Группа: " << endl;
cout << x[i].group << endl;
cout << "Оценки: " << endl;
cout << x[i].mark << endl;
cout << "\n";
}
}
fclose(f);
return 0;
}
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
string name;
int r;
cout << "Введите имя файла" << endl;
getline(cin,name);
rej = 0;
while (r!= 6) {
cout << "1.Создание файла" << endl;
cout << "2.Просмотр содержимого файла" << endl;
cout << "3.Добавление данных" << endl;
cout << "4.Удаление с файла" << endl;
cout << "5.Фамилия студента у которого "2" " << endl;
cout << "6.Выход" << endl;
cin >> r;
switch (r) {
case 1: create(name);
break;
case 2: watch(name);
break;
case 3: add(name);
break;
/*case 4: del(name);
break; */
case 5: find(name);
break;
}
}
return 0;
}
Просьба помочь, как можно скорее.
Ответы (1 шт):
Ну с чего бы начать.
Во-первых, как вам правильно указали в комментариях:
в функции
addциклwhileне закрыли послеn++;. идёт ошибка нет скобки. в функцииfindнет точки с запятой при декларации переменнойint n
Во-вторых, вы объявляете функции create(void), watch(void), add(void) и find(void) без параметров, а вызываете их в main с параметром name. Вам нужно определиться и либо вызывать их в main без параметров, либо объявлять их с параметром, например add(string str).
В-третьих, вам нужно экранировать кавычки внутри строки, если вы хотите их выводить: cout << "5.Фамилия студента у которого \"2\" " << endl;
UPD. В комментариях указали ошибку в функции find(), в условии нужно использовать не n[i], а x[i].
