1

まず、C++ に関する私の知識は非常に限られているため、これは私の最初のクラスなので、ばかげているように見えるかもしれませんが、ご容赦ください。

目標は、別の関数で読み取ることができるように、内部にルールを含むこのファイルを作成することです。ただし、これを実行するとエラーは発生しませんが、最初はスペースがまったくなく、最後にランダムな ascii が表示されます。

コードを実行した結果は次のとおりです Welcome to thetypinggame1.文全体を 1 行に入力します 2.時間とスコアに影響します

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

int main(int argc, char** argv) {
//set the sentences i want the file to print
char o[3][40]={"Welcome to the typing game             ",
            "1. Type the entire sentence in one line",
            "2. Is timed and will affect the score  "};

//creating the file to read in
ofstream out;
out.open("rules.txt");
for(int i=0;i<3;i++){
    for(int x=0; x<39; x++){
        out<<o[i][x];
    }
    out<<"\n";
}
out.close();


//creating a new array to read the data that was stored above
char a[3][40];
ifstream in;
in.open("rules.txt");
for(int i=0;i<3;i++){
    for(int x=0; x<40; x++){
        in>>a[i][x];
    }
}
in.close();

//and just printing out the array to see the results
for(int i=0;i<3;i++){
    for(int x=0; x<40; x++){
        cout<<a[i][x];
    }
}
return 0;
}
4

5 に答える 5

5

問題はここにあります:

in>>a[i][x];

抽出演算子は、>>フォーマットされたデータを抽出します。フォーマットされたデータとは、空白 (スペースなど) で区切られた文字のブロックを意味します。抽出中、空白文字はすべて無視されます。>>したがって、演算子を使用して空白文字を読み取ることはできません。

あなたがする必要があるのは、フォーマットされていないデータとして読むことです:

in.get(a[i][x]);

詳細はこちらこちらをご覧ください。

于 2012-05-24T08:27:28.807 に答える
2

この特定の例では >> を使用しないでください。ファイルからフォーマットされたデータを読み取ります。どちらかを使用

in.get(a[i][x]);

または、char 配列をドロップして文字列として宣言し、動的コンテナー (ベクトルとしましょう) に入れます。

ifstream in("rules.txt");
vector<string> myLines;
while (!in.eof()) {
    string temp;
    getline(in,temp);
    myLines.push_back(temp);
}

これで、ベクトルに格納された個別の文字列にすべてのルールが格納されました。それらをファイルに書き込むことも簡単です。for ループを 0 から 40 まで反復処理していて、文字列の長さが 40 文字でない場合、「random ascii」が取得されます。

于 2012-05-24T08:31:29.843 に答える
1

抽出演算子 >> はデフォルトで空白を無視します。他の回答で提案されているように、フォーマットされていないデータを読み取るか、次のようにデフォルトの動作を変更できます。

in.open("rules.txt");
in >> noskipws;
for(int i=0;i<3;i++){
    for(int x=0; x<40; x++){
        in>>a[i][x];
    }
}
于 2012-05-24T09:24:15.147 に答える
0

パート1

スペースなしで最初に出てきます

問題はここにあります

for(int x=0; x<39; x++){
   out<<o[i][x];
}

データのみを書き込み、出力をフォーマットしません。

考えられる解決策は 2 つあります。

  1. 使っ<iomanip>て使っsetwsetfill
  2. 各エントリの後 (または前) に空白を追加します。

2 番目のオプションの例:

for(int x=0; x<39; x++) {
    out << o[i][x] <<" ";
}

明らかに、これにより、最後のエントリの後 (または最初のエントリの前) にもスペースが挿入されます。これが必要ない場合は、追加のコードが必要です。

パート2

最後にランダムなASCIIを取得します

問題は(他の人が述べたように)ここにあります:

for(int i=0;i<3;i++){
    for(int x=0; x<39; x++)

書き込み/読み取りが必要な変数の実際のサイズを無視して、出力を任意に制限/増加します。

書き込みの場合 (画面でもファイルでも同じです)、次のようにする必要があります ( がochar 配列ではなく、ベクトルのベクトルである場合の解決策であることに注意してください。私は配列を使用しないことを好みます)。

for(int i=0;i<o.size();i++){
    for(int x=0; x<o[0].size(); x++)

代わりに、読み取りのために、行を変更しているかどうか、および/またはファイルの最後に到達したかどうかを確認する必要があります。

于 2012-05-24T08:47:27.687 に答える
0

私の記憶が正しければ、各行の末尾に /n がないと、「ワードラップ」が妨げられ、すべてが 1 行に表示されます。

于 2012-07-02T15:03:25.673 に答える