Как возможно прописать подсчет количества строк в файле, в который записывается группа? Что можно прописать вместо int nElem=ftell
//Составить файл из структур, описывающих фамилию и среднюю успеваемость учащихся группы //cl /nologo /EHsc BUF.cpp //BUF list.bin 2
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <io.h>
#include <fcntl.h>
#include <regex>
#include <iterator>
#include <exception>
#include <sstream>
using namespace std;
#include<string.h>
using namespace std;
// Константы
#define MAXSURNAME 15
#define MAXMARK 15
#define BUF_SIZE 128
/*static const struct GROUP {
char surname[MAXSURNAME + 1];
char mark[MAXMARK + 1];
}*/
int main(int argc, char* argv[])
{
// ----- Разбор аргументов командной строки -----
int nRecord = 0;
try {
switch (argc)
{
case 3:
if (sscanf(argv[2], "%d", &nRecord) != 1)
{
throw exception("Invalid record number in parameter ");
}
case 2:
break;
default:
throw exception("Not enough arguments");
}
}
catch (std::exception& e) {
cout << "Error: " << e.what() << endl << "Usage: <outputfile_name_path> [<string_number>]" << argv[0];
return 1;
}
struct GROUP { //структура
char surname[MAXSURNAME + 1];
char mark[MAXMARK + 1];
};
if (argc == 2) {//если 2 аргумента то открываем на ЗАПИСЬ
FILE* FileWrite = NULL;
try
{
FileWrite = fopen(argv[1], "wb");//Создает двоичный файл для записи.
if (FileWrite == NULL)
throw exception("Can`t open file");
static const GROUP Group[] = {
{"Ivanov", "5.0" },
{"Petrov","2.0"},
{"Sidorov", "5.0"},
{"Fedorov", "4.5"},
{"Aleksandrov", "3.0"},
{"Maramchin", "4.6"},
};
if (fwrite(Group, sizeof(GROUP), _countof(Group), FileWrite) != _countof(Group))// заполняем файл по-элементно Функция fwrite() записывает count объектов — каждый объект по size символов в длину — в поток, указанный stream, из символьного массива,
{
throw exception("Error in fwrite function");
}
fclose(FileWrite);
return 0;
}
catch (std::exception& e) {
cout << "Error: " << e.what();
if (FileWrite != NULL)
fclose(FileWrite);
return 1;
}
}
if (argc == 3) { //если 3 аргумента то открываем на ЧТЕНИЕ
FILE* FileRead = NULL;
try {
FileRead = fopen(argv[1], "rb");//Открывает двоичный файл для чтения.
if (FileRead == NULL)
throw exception("Can`t open file");
fseek(FileRead, 0, SEEK_END);
/*Функция fseek перемещает указатель позиции в потоке. Устанавливает внутренний указатель положения в файле,
в новую позицию, которая определяются путем добавления смещения к исходному положению.*/
int nElem = ftell(FileRead) / sizeof(Group[1]);/*Функция ftell возвращает значение указателя текущего положения потока. Для бинарных потоков,
/*string str;
int j = 0;
while (FileRead)
{
std::getline(FileRead, str);
j++;
} */ // возвращается значение соответствующее количеству байт от начала файла.*/
if (nRecord < 1 || nRecord > nElem) //если параметры вышли за рамки, то выдаем ошибку
throw exception("String does not exist");
fseek(FileRead, (nRecord - 1) * sizeof(struct GROUP), SEEK_SET);//SEEK_SET Начало файла
GROUP mygroup;
if (fread(&mygroup, sizeof(struct GROUP), 1, FileRead) != 1)/*Функция fread считывает массив размером — count элементов, каждый из которых имеет размер size байт,
из потока, и сохраняет его в блоке памяти*/
throw exception("Can't read file properly");
printf("%s %s", mygroup.surname, mygroup.mark);
}
catch (std::exception& e) {
cout << "Error: " << e.what();
if (FileRead != NULL)
fclose(FileRead);//закрываем файл
return 1;
}
}
return 0;
}