2017-02-13 3 views
-1

私はUbuntu操作システムでEclipseを使用していて、このデータを最初から "END OF HEADER"という文字列に印刷しようとしていますが、なぜ私が期待したものではないのか分かりません。なぜデータがunbuntu C++でeclipseで印刷されないのですか?

テール ".17n"という別のファイルを使用してテストしても機能しましたが、使用しようとしているファイルが "CAS100ATA_R_20160100000_01D_EN.rnx"で動作せず、データがwhileループにスタックされています。 2これらのデータファイルはまったく同じフォーマットですが、「.17n」や「.rxn」などの異なるテールフォーマットかもしれません。これをどうやって取得するのか分かりません。

誰でも助けることができれば、私はその助けに感謝します!

ここに私のコードと添付のデータファイルがあります。

ありがとうございました。

非常によろしくお願いいたします。

#include <iostream> 
    #include <iomanip> 
    #include <fstream> 
    #include <cstring> 
    #include <string> 
    #include <sstream> 
    #include <csignal> 
    #include <cstdio> 
    using namespace std; 

    const int MAX_CHARS_PER_LINE = 81; 

    nt main() { 
    string filename = "GANP00SVK_R_20160100000_01D_EN.rnx"; 

    ifstream   fin; 
    fin.open(filename.c_str()); 
    int head_lines = 0; 
    std::string header_end =("END OF HEADER"); 
    char line[MAX_CHARS_PER_LINE]; 

    while (1) // scanning data per line until hit the message "END OF HEADER" 
    { 
     head_lines++; 
     fin.getline(line, MAX_CHARS_PER_LINE); 
     std:: string line1(line); 
     std::size_t found = line1.find(header_end); 

     if (found!=std::string::npos) 
     { 
      break; 
     } 
    } 

    cout << "done!"<<endl; 
    return 0; 
} 

オプス、私はデータファイルをアップロードすることはできませんが、このリンクをクリックしてください、あなたはCAS100ATA_R_20160100000_01D_EN.rnxファイルを取得することができます。 ftp://cddis.gsfc.nasa.gov/gnss/data/daily/2016/010/16l/

+0

無限ループになるでしょう。このコードについては何もありません。 –

+0

@LightnessRacesinOrbit:間違ったコードを残念に思っています。ここには更新があります。あなたが見た以前のものは働いているものですが、私はデータの読み込みを停止したい行を検出できません。 "END OF HEADER"ラインに当たったときに理想的な新しいコードは、whileループ中に無限に飛び出しますが、whileループにはまだ突っ込んでいます。 –

+0

'getline'が成功したことをもうチェックしていないからです。なぜ 'char'配列に切り替わったのですか? –

答えて

0

新しいコードでは、ファイルが実際に正常に開くことを確認していません。あなたが実際に使用すると主張するよりも、今、あなたのコードは別の名前のファイルを開いているので、ファイルを開くチェックする

while (fin.good()) // scanning data per line until hit the message "END OF HEADER" 

:に行を変更します。したがって、開こうとするファイルが存在しない場合、コードは無限ループします(開かなかったため、fin.getline()は失敗し、何も読み込まないため終了条件には到達しません)。

ファイルを開くことができないときにエラーメッセージを表示する方が良いでしょう。


ので、まとめる(line char配列を削除)これを試してみる:

if (!fin.good()) 
    { 
     cerr << "Cannot open the file!" << endl; 
     return 1; 
    } 

    string line; 
    while (getline(fin, line)) // scanning data per line until hit the message "END OF HEADER" 
    { 
     head_lines++; 
     std::size_t found = line.find(header_end); 

     if (found!=std::string::npos) 
     { 
      break; 
     } 
    } 
+0

これは良い追加ですが、私はそれを使ってコードを実行すると、第1行だけを読み込み、whileループから飛び出しました。それは "HEADERの終わり"で止まらなかった。理想はありますか? –

+0

開こうとしているファイルが存在しないためですか?コード内のファイル名が実際にドライブ上のファイル名であることを確認してください。 – axalis

+0

はい、しました。ファイル名はまだ私が追加したパス上に存在します。私はデータを読むが、データファイルの第1行だけを読む。 –

0

私はこの問題を理解していません。
あなたが言及した入力ファイル(CAS100ATA_R_20160100000_01D_EN.rnx)を使って(Eclipse内からではなく)端末でプログラムを実行しましたが、問題はありませんでした。ファイル内のすべての行を出力しました。
私はオービットの@Lightness Racesのコメントに記載されているように無限ループをどのように持つことができないのか分かりません。

私も

... "END OF HEADER"は、あなたが余分な

string endstring("END OF HEADER"); 
ifstream myfile ("CAS100ATA_R_20160100000_01D_EN.rnx"); 
    if (myfile.is_open()) 
    { 
     while (getline (myfile,line)) 
     { 
      if (line.find(endstring) != string::npos) { 
       cout << "########## FOUND ###########" << endl; 
       cout << endstring << endl;  
      } 
      cout << line << endl; 

と、それを検知して、[OK]を印刷したを持っていることによって、その時点で実行を停止したい場合には罰金が検出されていることを確認$ ./test_readfile
3.03 NAVIGATION DATA E RINEX VERSION/TYPE gfzrnx-1.01から6325ファイル変換20160111 043737 UTC PGM/RUN BY/DATEのGALの7.5250e + 01 -7.3050e-01 1.0280e-02 に0.0000E + 00電離層CORR Gautの-3.7252902980e-09 1.776356840e-15 518400 1878 TIME SYSTEM CORR
17 17 1851年3うるう秒

####見つかり#############ヘッダヘッダ E11 2016 01 10 01 40 00 .182084622793e-04 .109565689854e-10 .000000000000e + 00 OF

END OF ############### END .... ....

Eclipse端末/コンソールに関連したいくつかの癖かもしれないし、このファイルのコンソール出力を見なかった実行コンフィギュレーションを正しくセットアップしないでください(ただし、ファイル名だけがあなたの言うことに応じて異なります)。

また、END_OF_HEADERを確認するときにbreakを入力すると、実行が目的のポイントで停止します。

。/ test_readfile
3.03 NAVIGATION DATA E RINEX VERSION /タイプgfzrnx-1.01から6325ファイル変換20160111 043737 UTC PGM/RUN BY/DATE GALの7.5250e + 01 -7.3050e-01 1.0280e-02 0.0000E + 00電離層CORR Gautの-3.7252902980e-09 1.776356840e-15 518400 1878 TIME SYSTEM CORR
17 17 1851年3うるう秒

####見つかり################### #########ヘッダーの終わり!
+0

ですから、私はあなたにこの点について同意します。しかし、新しいアップロードコード、fedepadに間違いはありますか? –

関連する問題