【问题标题】:Why is the next line not executing C++为什么下一行不执行 C++
【发布时间】:2014-11-05 21:00:25
【问题描述】:

我附上了可以打开.txt 文件的程序的完整源代码。它不会在cout << length 之后执行。我正在尝试使用数组将.txt 文件信息存储在内存中。

#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;

char filename[128];
char file[10][250];
int count;
int length;
string line;

int main ()
{
    int count = 0;
    int length = 0;
    cout << "Filename: ";
    cin.clear();
    cin.getline(filename, sizeof(filename));
    string new_inputfile(filename);
    ifstream inputfiles (new_inputfile.c_str());
    if(!inputfiles.is_open())
    {
        cout << "File could not be opened. \n ";
    }
    else
    {
        for (int i=0; getline(inputfiles,line); i++)
        {
            length++;
        }

        cout << length;
//      char file[length][250]; <- How can I create the array based on the length variable?
// CODE DOES NOT EXECUTE AFTER THIS.
        while(!inputfiles.eof() && (count<10))
        {
            inputfiles.getline(file[count],250);
            count++;
        }

        for(int i=0; i < count; i++)
        {
            cout << file[i] << endl;
        }

    }
    inputfiles.close();
    return 0;
}

另外,由于file[] 是字符,例如file[1] 包含字符Name=Mike,我如何剥离= 之前的所有内容。我只想要Mike。我知道string,我可以使用substr()方法,但我不知道char

【问题讨论】:

  • 为什么不直接用getline(cin, new_inputfile);,跳过中间人?
  • 文件不是char,而是char array 大不同。
  • @NeilKirk 你是什么意思?我应该把getline(cin, new_inputfile)放在哪里?
  • 你有string new_inputfile; getline(cin, new_inputfile);而不是cin.getline(filename, sizeof(filename)); string new_inputfile(filename);
  • @NeilKirk 谢谢。我如何存储线路?我听说你可以在没有数组的情况下做到这一点。就像我的txt 文件中的第一行是Name=Mike,我想将我的名称变量设置为Mike。我的第二行是Age=10,我想将我的年龄变量设置为10

标签: c++ arrays char ifstream


【解决方案1】:

这是一种非常浪费的方法来计算文件中的行数。

for (int i=0; getline(inputfiles,line); i++) // i is also completely useless here
{
     length++;
}

您阅读整个文件只是为了扔掉所有内容并重新开始!在此循环完成后,inputfiles.eof() 将变为 true,您将永远不会进入下一个 while 循环或最后一个 for 循环(因为 i == count)。执行直接跳到inputfiles.close(),然后你从main返回。

我建议您随时处理line 字符串:

for ( ; getline(inputfiles, line); )
{
     // do stuff with line and ditch the global char arrays
}

如果您想存储这些行以备后用,那么,只需保存它们即可:) 最简单的方法是使用 vector:

std::vector<std::string> all_them_lines;
while (getline(file, line) all_them_lines.emplace_back(line);

在那里,整个文件现在逐行保存在all_them_lines 中。您可以像在数组中一样访问它们,例如all_them_lines[0]。您也不需要事先知道行数 - 当您向其中添加内容时,向量会自动扩展。

现在要解析一行并从中提取格式化输入,请查看 stringstream class 提供的内容。

【讨论】:

  • 谢谢。那么我该如何存储线路呢?我听说你可以在没有数组的情况下做到这一点。就像我的txt 文件中的第一行是Name=Mike,我想将我的name 变量设置为Mike。我的第二行是Age=10,我想将我的age 变量设置为10
  • @user4167396 我扩大了答案。
  • 谢谢:)。有没有读取文件的方法,不是存储行,而是将行存储到变量中。例如,如果我的txt 文件中的第一行是Name=Mike,我想将我的name 变量设置为Mike。我的第二行是Age=10,我想将我的age 变量设置为10。我打算创建一个setNamesetAge 方法来存储行
  • 是的,有。不过,如果你能自己解决这个问题,我会很高兴的:) 提示:你可以做int age; cin &gt;&gt; age;。您可以对 ifstream 对象而不是 cin 执行相同操作。
  • 下一行呢?每行都有一个新值,因此需要一个新变量。请帮助我,这对我来说意义重大
【解决方案2】:

你问:

//      char file[length][250]; <- How can I create the array based on the length variable?

声明file为:

char (*file)[250] = NULL;

然后,

file = new char[length][250];

确保在函数结束之前调用delete [] file

你说:

// CODE DOES NOT EXECUTE AFTER THIS.

您可以rewind the stream 重新开始阅读。

    inputfiles.seekg(0);
    count = 0;
    while(!inputfiles.eof())
    {
        inputfiles.getline(file[count],250);
        count++;
    }

【讨论】:

  • @MattMcNabb,感谢您的评论。有时,直截了当地回答 OP 的问题比提出不同但更好的方法更有意义。有时我确实建议采用不同的方法。对于这个问题,我觉得直接回答问题更有意义。
  • 我不确定您所说的“切中要害”是什么意思。 char file[length][250] 是非法的,必须用一些法律代码替换。
  • 我的建议纠正了这个问题。它建议对 OP 的代码进行最小的更改以使代码合法。这就是我所说的“切中要害”的意思。
猜你喜欢
  • 2018-08-16
  • 2021-10-02
  • 2010-10-08
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多