0

次の.txtファイルがあります。

test.txt

1,2,5,6

次のようにコマンドラインから作成した小さなC++プログラムに渡します。

./test test.txt

ソースは次のとおりです。

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char **argv)
{
    int temp =0;
    ifstream file;
    file.open(argv[1]);

    while(!file.eof())
    {
        temp=file.get();
            file.ignore(1,',');
        cout<<temp<<' ';
    }
    return 0;
}

どういうわけか私の出力はではありません1 2 5 649 50 53 54。何が得られますか?

アップデート:

また、の別の実装があることに気づきましたget()。私が定義すれば、私はchar tempそれを行うことができfile.get(temp)、それはまた私がASCII表現を変換することを節約するでしょう。しかし、私は使うのが好きなwhile (file >> temp)ので、それを使います。ありがとう。

4

4 に答える 4

1

tempintです。したがって、charをintにキャストした後、エンコードされたASCII値が表示されます。

于 2013-02-24T01:05:58.627 に答える
0

これはあなたが思っていることをしません:

while(!file.eof())

これについては、ループ条件内のiostream::eofが間違っていると見なされる理由で説明されています。、それで私はこの答えでそれをカバーしません。

試す:

char c;
while (file >> c)
{
    // [...]
}

...代わりは。charではなくを読み取ると、 int表現を変換する必要もなくなります ASCII値49はなど)。1

于 2013-02-24T01:12:17.237 に答える
0

記録のために、そしてこれがn番目の複製であるにもかかわらず、このコードが慣用的なC++でどのように見えるかを次に示します。

for (std::string line; std::getline(file, line); )
{
    std::istringstream iss(line);

    std::cout << "We read:";

    for (std::string n; std::getline(iss, line, ','); )
    {
        std::cout << " " << n;

        // now use e.g. std::stoi(n)
    }

    std::cout << "\n";
}

行を気にしない場合、または1行しかない場合は、外側のループをスキップできます。

于 2013-02-24T01:15:36.293 に答える
0

49は、数字49-48=1のASCIIコードです。

get()あなたに文字(文字コード)を与えます。

ちなみに、読み取りが失敗した後にeof()のみtrueになるので、表示するコードは、

while(!file.eof())
{
    temp=file.get();
        file.ignore(1,',');
    cout<<temp<<' ';
}

最後に1つの無関係な文字が表示される可能性があります。

従来のループは

while( file >> temp )
{
     cout << temp << ' ';
}

ここで、式file >> tempは1つの数値を読み取り、への参照を生成しfile、そのオブジェクトは、あなたが書いたかのようにfile変換されます。bool

while( !(file >> temp).fail() )
于 2013-02-24T01:05:45.777 に答える