4

私が欲しいのは、txtファイルを読み取り、各行を配列に入れてから、複製コピーを別のtxtファイルに出力するc++プログラムです。これが私のコードです...

    #include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main ()
{
        string STRING ="";
        string list[10000];
        int i = 0;
    ifstream infile;
    infile.open ("C:/Users/Ryan/Desktop/data.txt");
      ofstream myfile;
  myfile.open ("C:/Users/Ryan/Desktop/data-2.txt");

        while(!infile.eof()) // To get you all the lines.
        {
            getline(infile,STRING);
            list[i]=STRING;
            myfile<<list[i];
            ++i;
        }


    infile.close();
  myfile.close();

  return 0;
}

どういうわけか、これをやっているのに、1行おきにファンキーな漢字がたくさん出てきます。これが私のdata.txtです...

BPC 20101206    V   0.13    0.13    0.13    0
BPC 20101207    V   0.13    0.13    0.13    6500
BPC 20101208    V   0.13    0.13    0.13    0
BPC 20101209    V   0.13    0.125   0.125   117000
BPC 20101210    V   0.125   0.125   0.125   0
BPC 20101213    V   0.125   0.125   0.125   0
BPC 20101214    V   0.13    0.13    0.13    5000
BPC 20101215    V   0.13    0.13    0.13    290
BPC 20101216    V   0.125   0.115   0.115   24000

そして、これが出力データです-2.txt ...

BPC 20101206    V   0.13    0.13    0.13    0
䈀倀䌀ऀ㈀ ㄀ ㄀㈀ 㜀ऀ嘀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ㘀㔀  ഀ BPC 20101208    V   0.13    0.13    0.13    0
䈀倀䌀ऀ㈀ ㄀ ㄀㈀ 㤀ऀ嘀ऀ ⸀㄀㌀ऀ ⸀㄀㈀㔀ऀ ⸀㄀㈀㔀ऀ㄀㄀㜀   ഀ BPC 20101210    V   0.125   0.125   0.125   0
䈀倀䌀ऀ㈀ ㄀ ㄀㈀㄀㌀ऀ嘀ऀ ⸀㄀㈀㔀ऀ ⸀㄀㈀㔀ऀ ⸀㄀㈀㔀ऀ ഀ BPC 20101214    V   0.13    0.13    0.13    5000
䈀倀䌀ऀ㈀ ㄀ ㄀㈀㄀㔀ऀ嘀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ㈀㤀 ഀ BPC  20101216    V   0.125   0.115   0.115   24000

何か案は?

4

4 に答える 4

4

元の問題に対処するために、書式設定されていない文字 (たまたま中国語) を出力しているように見えます。新しい行を挿入しているようには見えませんが (出力には新しい行があるようです)、表示されていないコードに何かが欠けています。REAL コードをカット/ペーストしてください

  1. 本当のコードは何ですか。
  2. ファイルからの出力をどのように生成しますか (エディターで開いたのは cat でしたか)。

主な注意点:

これを決してしないでください:

   while(!infile.eof())

使用する前に、その行を読んでテストする必要があります。
これは、読み取りを条件に入れることにより、1 行で実行できます。

    while(getline(infile,STRING))
    {
        list[i]=STRING;
        myfile<<list[i];
        ++i;
    }

その他の注意事項:

  1. コードを適切にフォーマットします!!!!!!
  2. すべて大文字の識別子を使用しないでください (これらは通常、マクロ用に予約されています)。
  3. 配列を使用しないでください。代わりに std::vector を使用してください。
  4. ファイルを 1 行で宣言して開く

    ifstream infile("C:/Users/Ryan/Desktop/data.txt");
    
  5. ループ条件として EOF をテストしないでください。

    • 別の問題がある場合、無限ループが発生する可能性があります。
    • 読み取りが機能していることを確認しない場合は、最後の行の処理を繰り返します。
  6. ファイルを手動で閉じないでください (デストラクタに任せてください)。

于 2011-12-06T11:46:00.717 に答える
3

私が間違っていなければ、あなたのOSはWindowsですか?

これらの「中国語」記号の理由は、.txtファイルがUnicodeでエンコードされているためです。メモ帳で開き、[名前を付けて保存]をクリックし、[エンコード]ドロップダウンリスト(ダイアログボックスの下部にあります)で[ANSI]を選択して、保存します。それは「中国の」問題を修正するはずです:)

コードの問題を修正するには、他の回答を確認してください。お役に立てば幸いです。

于 2011-12-06T12:05:22.143 に答える
1

データを書き戻すとき、改行を含めていないため、意図した場合は重複ファイルを作成していません。

とにかく直接書き戻すので、 List[] 配列を持つ理由はないようですが、代わりに行うことができます

getline(infile,STRING);
myfile << STRING << endl;  

ところで、STRING は適切な変数名ではありません。よりわかりやすい名前を選択してください。

于 2011-12-06T11:44:59.113 に答える
1

while(!eof) の代替案を詳述した素敵な記事を次に示します...ここ

于 2011-12-06T11:48:36.480 に答える