0

さて、getlineに問題があります。

いくつかの文字列を含むファイルがあります。私は自分で作成し、各文字列を別々の行に配置しました。

Ex. textfile.txt
    Line 1
    Line 2
    Line 3
    Line 4

//Little snip of code
    ifstream inFile("textfile.txt");
    getline(inFile, string1);

プログラムをデバッグして string1 を出力するように依頼すると、「Line 1\r」が string1 に保存されていることがわかります。ファイルを作成したときに実際にEnterキーを押したことが原因だと理解しています。この問題により、プログラムにセグメンテーション違反が発生します。ofstream を使用して最初にファイルを書き込んでから読み込むと、コードが機能することがわかっています。

したがって、私の質問では、エスケープシーケンス \r を取得せずに getline 関数を使用する方法はありますか? 明確でない場合は、お知らせください。

4

2 に答える 2

1

「\r」文字を使用しているという事実自体がセグ フォールトを引き起こす可能性は低いです。

その他の謎:
バイナリで書き込むためにファイルを開くと、出力はまさにあなたが出力したものになります。
テキストで書き込むためにファイルを開いた場合 (デフォルト)、出力は '\n' を除いて同じで、行末シーケンスに変換されます (詳細は後述)。

バイナリで読み取るためにファイルを開くと、入力はファイルにあるものとまったく同じです。
テキストで読み取るためにファイルを開く場合 (デフォルト)、入力は、文字 '\n' に変換される行末シーケンスを除いて、ファイルと同じです。

通常の状況では、これで問題ありません。しかし、すべてのプラットフォームには、回線終端シーケンスの独自の定義があるようです。したがって、MAC でテキスト ファイルを書き込んで PC で読み取ると、期待どおりに動作しない場合があります。

したがって、次のいずれかを実行していない限り、すべてが機能するはずです。

  • バイナリで書く/テキストで読む
  • テキストで書く/バイナリで読む
  • ファイルとOS1の書き込み/OS2でのファイルの読み取り
    • OS1/OS2 の回線終端シーケンスは同じではありません。

注 1: Binary モードでファイルを書き込む場合。テキスト モードを前提とする getline() を使用しないでください (行の終了シーケンスが行を分割することを想定しています)。サブノート:そこにいるペダンティックの場合、getline() はバイナリで動作する可能性がありますが、これはおそらく実装の詳細に依存しているため、移植可能と見なすべきではありません。

注 2: 上記は、ストリーム データをオンザフライで変換するファセットを実装する特殊なローカルをインストールしていないことを前提としています。

于 2010-03-21T09:32:47.893 に答える
0

標準ライブラリが正しく実装されている場合、終端文字はストリームから削除されますが、文字列には追加されません。文字列に追加されたとしても、セグメンテーション違反は発生しません。問題は別の場所にあると思います。

于 2010-03-21T03:47:12.743 に答える