9

次の形式の整数を含むファイルがあるとします

1 57 97 100 27 86 ...

入力ファイル ストリーム fin があり、ファイルから整数を読み取ろうとするとします。

ifstream fin("test.txt");
int val;
fin>>val;

今、私はこのアクションをwhileループで実行しています。ある期間に、ファイルポインタを正確に1つの整数に戻したいと考えています。つまり、ファイル ポインタが整数を読み取ろうとしている27場合fin>>val、整数を読み取れるようにファイル ポインタを移動し100ますfin>>val。使用できることはわかってfin.seekg()いますが、ファイルポインタを整数ではなく文字で移動するためだけに使用しました。

おそらくこれは素朴な質問です。しかし、誰かが私を助けてくれませんか?

4

6 に答える 6

4

tellg各読み取り後に使用して、後で使用するポインターを保存できますseekg

の実装を取得して、<<毎回進めた文字数も返す関数で変更することもできます。のソース コードを見つける場所はoperator<<、私が簡単にお手伝いできるものではありません。

于 2013-10-10T15:49:02.940 に答える
3

あなたの場合、それは整数ではなく、数値を表すテキストです。このため、数字以外の文字 ( ) が見つかるまで、1 文字ずつ後ろに移動する必要があります!isdigit(c)

以下のコメンターの 1 人が指摘したように、数値が負になる可能性がある場合に備えて、「マイナス」記号にも注意を払うことができます。

于 2013-10-10T15:38:51.640 に答える
0

最初の引数はファイル名、2 番目の引数は番号のインデックス、プログラムはインデックスの番号を表示し、前の番号 (ゼロから数えて) を表示します。

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>


int main(int argc, char *argv[]){
    if(argc != 3){
        std::cout<<"argument error!\n";
        return 1;
    }

    std::ifstream read;
    read.open(argv[1],std::ios::app);
    if( read.is_open() ){
        std::vector<int> numbers;
        int temp;
        while(read >> temp){
            numbers.push_back(temp);
        }

        std::cout<<"1) "<<numbers[atoi(argv[2])]<<"\n2) "<<numbers[atoi(argv[2]-1)]<<std::endl;

            read.close();

    }else {
        std::cout<<"file open error!\n";
        return 2;
    }

    return 0;
}
于 2013-10-10T15:56:06.970 に答える
0

次のことを試してください。

#include <iostream>
#include <fstream>
#include <locale>

int main()
{
    std::ifstream fin("test.txt");
    int val;

    bool back = false;
    for (int i = 0; fin >> val;)
    {
        if (!back && val == 27)
        {
            while (i++ < 2)
                while (!std::isspace(fin.unget().rdbuf()->sgetc()));
            back = true;
        }
    }
}
于 2013-10-10T15:54:53.813 に答える
0

istream::unget()を見ることができます

于 2013-10-10T15:41:19.510 に答える