【问题标题】:C++ Read/Write to textfile issueC ++读/写到文本文件问题
【发布时间】:2011-04-14 15:25:57
【问题描述】:

我需要在文本文件中写入数字和文本,原因不明,写入有效,读取无效,问题在于读取文本,如下例所示:

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 保持为空...

【问题讨论】:

  • 您为此问题选择了一组糟糕的标签。如果你想要更多的答案,你应该改变它。没有人在寻找这些标签。改用C++ 或者与fstream 相关的东西。
  • 好的,谢谢,我加了。
  • 23 次浏览仍然没有答案,这是一个奇怪的问题我告诉你 XD

标签: c++ text fstream getline


【解决方案1】:

提取运算符不使用空格,因此getline 只是读取第一行剩余的空格。尝试在致电 getline 之前添加此内容:

ff2.ignore(255, '\n');

【讨论】:

  • 现在这是我需要的答案 :),但是 255 的任何原因,1 还不够吗?
【解决方案2】:

您的主要问题是,当您读取字符串时,第一行末尾的\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;
}

【讨论】:

  • 感谢您花时间解释这一切,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
相关资源
最近更新 更多