不明白这段代码?这是关于用c ++读取文件

时间:2016-04-07 01:10:03

标签: c++ file ifstream argv

我在C ++中有一项工作要做,它假设读取文件.txt并使用里面的信息。但是我们的老师给了我们代码的开头来帮助我,我真的不明白。我是c ++的初学者,所以我一直在寻找它好几个小时,但我找不到答案,谢谢!

这是一段代码:

int main(int argc, const char** argv)
{
    std::ifstream* myfile = NULL;

    if (argc == 2) {
        file = myfile = new std::ifstream(argv[1]);
        if (myfile->fail())
            std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl;
    }
    else
        std::cerr << "No file name." << std::endl;

    while (*file) {
        std::string event;
        *file >> event;
        if (!(*file)) break;

        if (event == "recipe") {
            std::string namerecipe;
            *file >> recipe;

...

我不明白吗?什么是*档案?和文件?它是文件上的指针吗?为什么没有像get line这样的函数呢?为什么“while * file”应该这样做? 非常感谢你 !

2 个答案:

答案 0 :(得分:1)

int main(int argc, const char** argv)
{

典型的功能入口点。

    std::ifstream* myfile = NULL;

    if (argc == 2) {

确保有足够的参数从argv[1]获取文件名。

        file = myfile = new std::ifstream(argv[1]);

动态分配文件输入流并尝试使用它来打开argv[1]中指定的文件。然后将此文件流分配给两个指针filemyfile。我承认没有注意到有两个指针,但我也没有看到指针的位置。

        if (myfile->fail())

调用流的fail功能。这将测试流是否有任何问题。此时,所有要测试的是流是否打开。

            std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl;
    }
    else
        std::cerr << "No file name." << std::endl;

    while (*file) {

取消引用file指针以对文件对象进行操作。这将调用流的布尔运算符。它具有相同的(C ++ 11或更新近期)或类似的情况,在这种情况下(在C ++ 11之前)无关紧要,因为调用!file->fail()。有关运算符bool的更多信息,请访问:http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

        std::string event;
        *file >> event;

从流中读取一个以空格分隔的标记,一个单词。

        if (!(*file)) break;

操作员再次布尔。失败时退出循环。

        if (event == "recipe") {
            std::string namerecipe;
            *file >> recipe;

从流中读取另一个单词。

代码可以按以下方式重写:

int main(int argc, const char** argv)
{
    if (argc == 2) 
    {
        std::ifstream myfile(argv[1]);
        if (myfile)
        {
            std::string event;
            while (myfile >> event) 
            {
                //this function is getting deep. Consider spinning this off into a new function
                if (event == "recipe") 
                {
                    std::string namerecipe;
                    if (myfile >> recipe)
                    {
                        // do stuff that is missing from code sample
                    }
                    else
                    {
                        // handle error
                     }
                 }
            }
        }
        else
        {
            std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl;
        }
    }
    else
    {
        std::cerr << "No file name." << std::endl;
    }
}

答案 1 :(得分:0)

  1. *file是指向输入文件流ifstream对象的指针。
  2. file是您的输入文件流ifstream对象。

  3. while(*file)正在使用流的布尔运算符来测试输入文件流中的错误情况(在读取文件时没有错误)