1

私は初心者の C++ 学生です。ファイルを配列構造に読み込むのに問題があります。これはクラスの割り当てなので、コードを実行する必要はありません。何が間違っているのか知りたいだけです。私が読んでいるテキストファイルは次のようにフォーマットされています:

Giant Armadillo#443#M
Hawaiian Monk Seal#711#M 
Iberian Lynx#134#M
Javan Rhinoceros#134#M etc...

を使用getline()すると、区切り記号を含む文字列を正しく読み取ることができますが、または'#'では機能しません。区切り文字をチェックしながらorを読むにはどうすればよいですか? ありがとう、これが明確に書かれていないか、適切にフォーマットされていない場合は申し訳ありません. 私はSOが初めてです。intcharintchar

#include <iostream>
#include<string>
#include <fstream>
#include <cstdlib>
using namespace std;

//Create a new structure
struct Endangered
{   
    string name;
    int population; 
    char species;
};


int main () {

Endangered animals[200];

//initialize animals
for (int i=0; i<50; i++)
{
    animals[i].name=" ";
    animals[i].population=0;
    animals[i].species=' ';
}

ifstream myFile;
myFile.open("animals.txt");
int i=0;
if (myFile.is_open())
{   
    while (myFile.eof())
    {   
        //read the string until delimiter #
        getline(myFile, animals[i].name, '#');

        //read the int until delimiter #
        getline(myFile, animals[i].population, '#');

        //read the char until the delimiter
        getline(myFile, animals[i].species, '/n');
        i++;
    }


    return 0;
}
4

4 に答える 4

0

プログラムの読み取り部分は次のようになります。

size_t i=0;
ifstream myFile("animals.txt");
if(!myFile)
{
  throw std::runtime_error("Failed opening file");   
}
string line;
while(std::getline(myFile, line))
{
  istringstream line_stream(line);
  string temp;
  if(!std::getline(line_stream, temp, '#'))
    throw std::runtime_error("expected #");
  animals[i].name = std::stoi(temp);

  if(!std::getline(line_stream, temp, '#'))
    throw std::runtime_error(expected #");

  animals[i].population = std::stoi(temp);

  if(!std::getline(line_stream, temp) || temp.size() != 1) // or whatever input verification you need
    throw std::runtime_error("expected species");
  animals[i].species = temp[0]; // or whatever input you need, this assumes species is a char
}

ここですべてのバッファリングを行わない方法もありますが、これはうまくいくはずです。

于 2013-04-05T07:13:27.827 に答える
0

問題は、getLine 関数が次の区切られた値を文字列として返すことです。 Function def: getline (istream& is, string& str, char delim);

コードを変更して、値を一時文字列変数に読み込みます。

次に、 std::stoi( str ) を使用して文字列値を整数に変換し、返された値を人口に割り当てます。

あなたはコードを提供しないように要求したので、実装はあなたに任せます。

お役に立てれば。

于 2013-04-05T07:13:54.860 に答える