0
4

5 回答 5

3

近似地,这是因为您正在扫描整个缓冲区,而不仅仅是在最后一个 getline() 期间实际读取的部分。

但在更基本的层面上,这是因为您使用的是字符数组而不是字符串。C++ 字符串存在的原因有很多,但其中一个大问题是避免了与固定大小缓冲区相关的许多错误。

于 2013-09-04T15:24:28.803 回答
0

你不应该使用:

while(!read.eof())

因为只有在您读取文件中的最后一个字符之后才会设置 EOF 位。有关更多信息,请查看此线程: 为什么循环条件内的 iostream::eof 被认为是错误的?

于 2013-09-04T15:27:11.793 回答
0

您的线路:

for(int i = 0; i < 100; i++)

应该:

for(int i = k+1; i < 100; i++)
于 2013-09-04T15:22:22.783 回答
0

这确实比它需要的复杂得多。你可能会考虑这样的事情:

#include <iostream>
#include <string>
#include <fstream>

int main()
{   
    std::string inputFilename;
    std::cout << "Enter Filename:";
    std::cin >> inputFilename;

    std::ifstream inputFile(inputFilename);
    if(inputFile)
    {
        std::string line;
        while(std::getline(inputFile, line))
        {
            if(line.find('#') != std::string::npos)
            {
                size_t startPos = line.find_first_of("<\"");
                size_t endPos = line.find_last_of(">\"");
                if(startPos != std::string::npos && endPos != std::string::npos)
                {
                    //advance start to after the < or "
                    ++startPos;
                    //sanity check just in case the line was ill formed
                    if(startPos < endPos)
                    {
                        std::cout << line.substr(startPos, endPos - startPos) << std::endl;
                    }
                }
            }
        }
    }
    else
    {
        std::cout << "File '" << inputFilename << "' does not exist." <<  std::endl;
    }
    return 0;
}
于 2013-09-04T15:46:55.753 回答
0

使用while (std::getline(stream, line))代替while(!stream.eof())并避免使用 C 风格的字符串 ~> 使用std::string对象代替。

逐行解析文件可能如下所示:

std::string filename;
std::cout << "Enter Filename: ";
std::cin >> filename;

std::ifstream read(filename.c_str());
if (read.is_open())
{
    std::string line;
    while (std::getline(read, line))
    {
        // skip empty lines:
        if (line.empty())
            continue;
        ...

现在,代替您的“程序”方法,每一行的处理可能如下所示:

std::size_t pos = line.find("#include");
if (pos != std::string::npos)
    processInclude(line.substr(pos + 8));

并且为了避免“烹饪意大利面条代码”,有时将一些功能提取到独立函数中而不是嵌套另一个范围(if(){ for(){ if(){ for(){ ...)会很巧妙:

void processInclude(std::string line)
{
    std::string filename;
    for (size_t i = startPos; i < line.size(); ++i)
    {
        if (line[i] == '<')
        {
            std::getline(std::istringstream(line.substr(i + 1), filename, '>');
            break;
        }
        else if (line[i] == '"')
        {
            std::getline(std::istringstream(line.substr(i + 1), filename, '"');
            break;
        }
    }
    if (!filename.empty())
        std::cout << filename << std::endl;
}

希望这有助于或至少让您以不同的方式查看您的代码:)

于 2013-09-04T15:33:01.897 回答