Тип вектора внутри fgets

У меня есть теория, я могу получить размер файла с помощью fseek и ftell и построить динамический массив в качестве буфера. Затем используйте буфер для fgets (). Я в настоящее время не могу придумать способ сделать это.

Моя теория основана на незнании размера первого файла в байтах. Итак, я не знаю, насколько большой буфер для создания. Что делать, если файл превышает 2 гигабайта? Я хочу иметь возможность создать буфер, который будет изменять и распознавать размер файла любого файла, который я поместил в SearchInFile ().

Вот что у меня так далеко внизу:

int SearchInFile(char *fname, char *fname2)
{
FILE *pFile, *pFile2;
int szFile, szFile2;

// Open first file
if( (fopen_s(&pFile, fname, "r")) != NULL )
{
return(-1);
}

// Open second file
if( (fopen_s(&pFile2, fname2, "r")) != NULL )
{
return(-1);
}

// Find file size
fseek(pFile, 0L, SEEK_END);
szFile = ftell(pFile);
// Readjust File Pointer
fseek(pFile, 0L, SEEK_SET);

std::vector <char> buff;
//char buff[szFile];

while(fgets(buff.push_back(), szFile, pFile))
{}

Любые мысли или примеры будут великолепны. Я искал в сети последние несколько часов.

0

Решение

Вектор может расти, поэтому вам не нужно заранее знать размер. Следующие четыре строки делают то, что вы хотите.

std::vector<char> buff;
int ch;
while ((ch = fgetc(pFile)) != EOF)
buff.push_back(ch);

fgetc это функция для чтения одного символа, проще чем fgets,

Если вы заранее знаете размер файла, вы можете позвонить buff.reserve(szFile) перед петлей. Это сделает цикл немного более эффективным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector