0

数字とテキストをテキストファイルに書き込む必要があります。理由は不明ですが、書き込みは機能しますが、読み取りは機能しません。問題は、次の例のようにテキストを読み取ることです。

fstream ff,ff2;
int a,b;
ff.open("simtestagain.txt",ios::out);
CString mycstring = _T("Name with spaces");
char mycharbuffer[255];         //destination buffer
size_t convertedChars = 0;      //number of characters converted
wcstombs_s( &convertedChars, mycharbuffer, mycstring.GetLength()+1,mycstring.GetBuffer(), _TRUNCATE);
ff << 1 << endl;
ff << mycharbuffer << endl; 
ff << 2 << endl;

ff.close();

ff2.open("simtestagain.txt",ios::in);

ff2 >> a;
ff2.getline(mycharbuffer,255);
mycstring = mycharbuffer;
ff2 >> b;

ff2.close();
AfxMessageBox(mycstring);

値はOKで、CStringは空のままです...

4

2 に答える 2

1

抽出演算子は空白を消費しないためgetline、最初の行に残っている空白を読み取るだけです。に電話する前にこれを追加してみてくださいgetline

ff2.ignore(255, '\n');
于 2011-04-14T16:37:28.190 に答える
0

主な問題は、文字列を読み取るとき\nに、最初の行の終わりにあるがまだ入力バッファにあることです。入力バッファでgetline次の文字列を読み取るだけなので、空の文字列が得られます。\n

IMO、少し違ったやり方をしたほうがいいでしょう。まず、を使用した明示的な変換の代わりに、変換を自動的に処理するwcstombs_sを使用する方がよいでしょう。wofstreamまた、通常はを使用する必要があります。同じストリームを介して読み取りと書き込みを行う場合[w]ifstream[w]ofstream除きます。

#include <fstream>
#include <string>
#include <windows.h>

int main() { 
    char name[] = "simtestagain.txt";
    std::wofstream ff(name);
    std::wstring my_string(L"Name with spaces");

    // avoid unnecessary flushes by using "\n" instead of std::endl;
    ff << 1 << "\n" << my_string << "\n" << 2 << "\n";

    ff.close();

    std::ifstream ff2(name);
    int a,b;
    char ignore;
    std::string my_second_string;

    ff2 >> a >> std::noskipws >> ignore;
    std::getline(ff2, my_second_string);
    ff2 >> b;

    MessageBox(NULL, my_second_string.c_str(), "", MB_OK);
    return 0;
}

ただし、これは、マルチバイト文字としてファイルに書き込んだ文字列が実際にはすべてシングルバイト文字としてエンコードされるという事実に依存するため、から書き込んだものは。std::wstringとしてきれいに読み取られることに注意してくださいstd::string。この場合は正しいですが、一般的な場合はそうではありません。それが機能するのは、コンテンツがすべて基本的にプレーンASCIIである場合のみです(したがって、ワイド文字や変換などで遊ぶ理由は基本的にありませんでした)。

ワイド文字をサポートしたい場合は、ワイド文字として書き込んだものをワイド文字として読み戻す必要があります。これにより、ファイルの処理も少し簡素化されます。同じストリームを介してデータの読み取りと書き込みを行うことができます。

#include <fstream>
#include <string>
#include <windows.h>

int main(){ 
    char name[] = "simtestagain.txt";
    std::wfstream ff(name);
    std::wstring my_string(L"Name with spaces");

    ff << 1 << "\n" << my_string << "\n" << 2 << "\n";

    ff.seekg(0);

    int a,b;
    wchar_t ignore;
    std::wstring my_second_string;

    ff >> a >> std::noskipws >> ignore;
    std::getline(ff, my_second_string);
    ff >> b;

    MessageBoxW(NULL, my_second_string.c_str(), L"", MB_OK);
    return 0;
}
于 2011-04-14T16:53:44.943 に答える