fgets内部的矢量类型

Vector type inside fgets

本文关键字:类型 内部 fgets      更新时间:2023-10-16

我有这个理论,我可以使用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))
    {

    }

任何想法或例子都会很棒。我一直在搜索网络过去几个小时。

向量可以增长,因此您不必事先知道大小。以下四行完成您想要的。

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

fgetc是读取单个字符的函数,比使用fgets更简单。

如果您确实会事先知道文件大小,则可以在循环前调用buff.reserve(szFile)。这将使循环效率更高。