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 のみを使用するようにコードを変更することをお勧めします。atoi を取得するには #include を追加する必要があります。

于 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 に答える