1

テキスト ファイルから整数を読み取り、非整数と奇妙なシンボルをスキップするプログラムがあります。次に、テキスト ファイルは次のようになります。

# Matrix A   // this line should be skipped because it contains # symbol
1 1 2
1 1$ 2.1      // this line should be skipped because it contains 2.1 and $
3 4 5

奇妙な記号や非整数の行なしで行列を出力する必要があります。つまり、出力は次のようになります。

1 1 2
3 4 5

私のコード

ifstream matrixAFile("a.txt", ios::in); // open file a.txt
if (!matrixAFile)
{
      cerr << "Error: File could not be opened !!!" << endl;
      exit(1);
}

int i, j, k;
while (matrixAFile >> i >> j >> k)
{
      cout << i << ' ' << j << ' ' << k;
      cout << endl;
}

しかし、最初の # 記号を取得すると失敗します。誰でも助けてください?

4

5 に答える 5

1

あなたの問題はこのコードにあります。

int i, j, k;
while (matrixAFile >> i >> j >> k)

宿題は「行に整数が含まれているか調べる」

しかし、あなたのコードは「行に整数が含まれていることはすでに知っています」と言っています

于 2012-09-02T23:10:21.937 に答える
1

行ごとに 3 つの整数に設定されている場合は、次のパターンをお勧めします。

#include <fstream>
#include <sstream>
#include <string>

std::ifstream infile("matrix.txt");

for (std::string line; std::getline(infile, line); )
{
    int a, b, c;

    if (!(std::istringstream(line) >> a >> b >> c))
    {
        std::cerr << "Skipping unparsable line '" << line << "'\n";
        continue;
    }

    std::cout << a << ' ' << b << ' ' << c << std::endl;
}

1 行あたりの数字の数が可変の場合、次のようなスキップ条件を使用できます。

line.find_first_not_of(" 0123456789") != std::string::npos
于 2012-09-02T23:22:24.497 に答える
0

もちろん、これは次の#文字で失敗します: The #isn't an integer であり、したがって、整数として読み取ることは失敗します。あなたができることは、3 つの整数を読み取ろうとすることです。これが失敗し、EOF (つまり、matrixAFile.eof()yields ) に達していない場合、エラー フラグと改行までのすべてfalseを使用できます。エラーの回復は次のようになります。clear()ignore()

matrixAFile.clear();
matrixAFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

eof()が原因で失敗した場合は、救済する必要があることに注意してくださいtrue

于 2012-09-02T23:11:15.853 に答える
0

課題なので、完全な回答はしません。

Read the data line by line to a string(call it str),
Split str into substrings,
In each substring, check if it's convertible to integer value.

別のトリックは、行を読み取り、すべての文字が 0 ~ 9 であることを確認することです。負の数を考慮する必要がない場合に機能します。

于 2012-09-02T23:06:53.143 に答える