C ++读取/写入文本文件问题

| 我需要在文本文件中写数字和文本,原因不明,书写有效,阅读无效,问题在于读取文本,如以下示例所示:
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);
a值可以,CString保持为空...     
已邀请:
提取运算符不会占用空白,因此
getline
只是读取第一行中剩余的空白。尝试在致电
getline
之前添加以下内容:
ff2.ignore(255, \'\\n\');
    
您的主要问题是,当您读取字符串时,第一行末尾的
\\n
仍在输入缓冲区中。由于
getline
仅读取输入缓冲区中的下一个
\\n
,因此您将获得一个空字符串。 IMO,您最好做一些不同的事情。首先,最好不要使用
wofstream
,它会自动处理转换,而不是使用
wcstombs_s
进行显式转换。除非打算通过相同的流进行读写,否则通常还应使用
[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;
}
    

要回复问题请先登录注册