读/写文本文件的问题
C++ Read/Write to textfile issue
我需要在文本文件中写入数字和文本,由于未知的原因,写作工作,阅读不,问题是阅读文本,如以下示例:
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
,因此您将得到一个空字符串。
在我看来,你最好做一些不同的事情。首先,与其使用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;
}
相关文章:
- 使用mongocxx驱动程序时包含头文件问题
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 编译要在英特尔Hyperscan中使用的.cc文件时出现问题
- 使用 seekg() 读取C++中的文件时出现问题
- sqlite3 和生成文件中的链接出现问题
- C++头文件和类实现出现问题
- 用户输入字符串的文件附加问题..C++
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 读取文件并将其存储在unordered_map中时出现问题
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 我在使用C++文件时遇到了一些问题
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 将文件复制到自定义位置,存在字符串转换问题
- DirectX12 的问题:"d3dApp.h":没有这样的文件或目录
- (ODR 使用问题)在不同文件中priority_queue名称相同的结构
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 读取制表符分隔的文件时出现问题 C++
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- C++:读取.BMP文件时出现问题;文件结束时间早于预期