3

私はこのようなファイルを読んでいます:

char string[256];

std::ifstream file( "file.txt" ); // open the level file.

if ( ! file ) // check if the file loaded fine.
{
    // error
}

while ( file.getline( string, 256, ' ' )  )
{
    // handle input
}

テストの目的で、私のファイルは1行で、最後にスペースがあります。

12345 

私のコードは最初に12345を正常に読み取ります。しかし、ループが終了する代わりに、別の文字列を読み取ります。これは、return/newlineのようです。

ファイルをとに保存geditしましたnano。また、Linuxcatコマンドで出力しましたが、最後には戻りません。したがって、ファイルは問題ないはずです。

コードがリターン/改行を読み取るのはなぜですか?

ありがとう。

4

4 に答える 4

4

最初のリートは、入力ファイルが適切であることを確認します。

次のコマンドを実行して、出力を知らせてください。

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream file("file.txt");
    std::cout << std::hex;

    std::copy(std::istreambuf_iterator<char>(file),
              std::istreambuf_iterator<char>(),

              std::ostream_iterator<int>(std::cout, " ")); 
}

編集:

出力は313233 34 35200Aでした

このコードを実行して、出力が何であるかを確認してください。

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ofstream file("file.txt");
    file << "12345 \n";
}

このファイルの出力をダンプして、元のファイルと比較します。
問題は、プラットフォームが異なれば回線終端シーケンスも異なることです。「0x0A」がプラットフォームの回線終了シーケンスであることを確認したいだけです。ファイルがテキストモードで読み取られると、行終了シーケンスが'\ n'に変換され、テキストモードでファイルに'\ n'を出力すると、行終了シーケンスに変換されることに注意してください。

編集2

だから私はファイルを持っています:file.txt

> od -ta -tx1 file.txt
0000000    1   2   3   4   5  sp  nl                                    
           31  32  33  34  35  20  0a                                    
0000007

したがって、ファイルにはで終わる1行が含まれています0x0A

このプログラムの使用:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream   file("file.txt");

    std::string line;
    while(std::getline(file,line))
    {
        std::cout << "Line(" << line << ")\n";
    }
}

私は得る:

> g++ t.cpp
> ./a.out
Line(12345 )
于 2011-01-16T06:32:52.660 に答える
2

それは働いています...

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

ifstream file("file.txt");

int main()
{
   string tmp="",st="";

   while (!file.eof())
    {
      file>>tmp;  
      if (tmp != "") st+=tmp;
      tmp="";  
    }
   cout<<st<<endl; 

   return 0;
}

input file.txt:1 2 3 4 5
回答:12345

于 2011-01-16T06:09:45.160 に答える
0

この方法を試してください:

while ( !file.eof()  )
{
    file.getline( string, 256, ' ' );
        // handle input
}
于 2011-01-16T06:15:46.167 に答える
0

古いですが、これに対する適切な解決策はないようです。

彼がスペース区切り文字を使用していることに誰も気づいていないことに驚いています。そのため、行全体が読み取られることはなく、最初のスペースまでしか読み取られません。したがって、getlineには、EOFに遭遇する前に読み取るデータがまだあります。

したがって、次のgetlineはnewlineを読み取り、区切り文字と同じものを返します。getline呼び出しが次のような場合:

file.getline(string、256)

改行は返されず、1ステップで終了します。

于 2020-03-19T04:32:42.687 に答える