4

所以我有一个看起来像这样的数据文件:

x + y + z

30 45 50

10 20 30

我需要的唯一字符是运算符,因此我能够使用 '+' '+'file.get()成功获取这些字符并将它们放入数组中。问题是我需要获取下一行数字,并将它们分配给值 x , yz 。我知道我不能使用 .get() ,我必须使用getline. 我是否也必须消除file.get()并使用getline第一部分代替?

我查看了此处发布的一些问题,但没有一个问题与我的非常相似。注意我实际上将这些值用于我程序的另一部分,只是用来cout查看我的值是否被正确读取 这是我以前的代码:

main(int argc, char *argv[])
{
    int a=0;
    int n;
    fstream datafile;
    char ch;
    pid_t pid;
    int a, b, c, result;
   

    string line;
    datafile.open("data1.txt");

    if(datafile)
    {
      for(int i=0; i <9; i++)
      {     
        datafile.get(ch);
      
        if (ch == '*'||ch == '/'||ch == '+'||ch == '-')
        {
           operations[a] = ch;
           cout<<operations[a];
           a++;
        }

      }
    }

    else
        cout<<"Error reading file"; 
}

所以这就是我在开始时获取文件第一行的方式。它像我想要的那样工作,可能不是最好的编码,但它确实有效。尽管如此,我还是尝试获取文件的其余部分,这次使用getline,但我没有得到数字,而是得到了一堆随机的乱码/数字。我知道如果我使用getline,第一行不能在我的循环中。我知道这就是我获得数字的方式。

 while(getline(datafile, line))
 {
   istringstream  ss(line);
   ss >> x >> y >> z;
   cout<<x<<""<<y<<""<<z;
 }
4

2 回答 2

2

以下内容对于第一行是否有意义,或者我是否遗漏了什么:

string input;
std::getline(datafile, input)
for (int i = 0; i < input.size(); i++)
    if (input[i] == '+' || ...)
    {
        operations[a] = input[i];
        a++;
    }

如果您不想使用 getline,您可以简单地读取整个文件流(注意 bool 是一种处理问题的相当幼稚的方法,我建议在您的实际代码中使用更优雅的方法):

bool first = true;
string nums;
int lines = 0;
vector<vector<int>> numlines;
vector<int> topush;
while (!datafile.eof())
{
char ch = datafile.get()
if (ch == 12 && first) //I don't know if '\n' is valid, I'd assume it is but here's the sure bet
    first = false;
else if (first && (ch == '+' || ...))
{
    operator[a] = ch;
    a++;
}
else if (!first && (ch >= '0' && ch <= '9'))
{
    if (!(datafile.peek() >= '0' && datafile.peek() <= '0'))
    {
         numlines[lines].push_back(atoi(nums.c_str());
         nums.clear();
         if (datafile.peek() == 12)
         {
             numlines.push_back(topush);
             lines++;
         }
    }
    else
        nums = nums + ch;
}

老实说,我不能确定以上内容是否完全正确,我建议您只修改您的代码以专门使用 getline。您需要添加#include 来获取atoi。

于 2013-08-14T02:03:05.843 回答
0

将此添加到您的代码中:

while(!datafile.eof()){
    string s;
    getline(datafile, s);
    istringstream in(s);
    string tmp;
        while(in >> tmp){
            int i = stoi(tmp) 
            //Do something with i....
        }
}
于 2013-08-14T01:50:01.600 回答