Как возможно прописать подсчет количества строк в файле, в который записывается группа? Что можно прописать вместо 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;
}

Ответы (0 шт):