【发布时间】:2011-12-02 11:38:56
【问题描述】:
如果字符串不超过 20 个字符并且在 C++ 中可以包含空格,您将如何读取它?例如我有这种文件:
3
Namama 4 5 12
Cool 4 2 34
Not So Cool 4 2 45
我想用最基本的方式来写它。在这种情况下,我宁愿只使用 C++(没有 C 的东西)。这意味着我想将它存储在 std::string 中。
我可以使用 istream::get 或 istream::getline 但我必须避免使用换行符。这是有问题的(我正在编写的代码将向初学者展示)。
你对这个问题有什么解决方案?
编辑:
按照要求,我将告诉您我尝试过的方法,但我认为这不会有任何好处。我不是 C++ 初学者,通常我会使用诸如 istream::get 和 char 数组之类的东西,但对于某些人来说,删除换行符可能看起来太技术了。
所以... 使用 istream::operator>> 读取 char 数组或 std::string 失败,因为当他们看到空格字符时它会停止读取(而我可能要读几个字)。这意味着以下代码失败:
char name[21];
std::cin >> name;
或者...
std::string name;
std::cin >> name;
另一件事是换行符因系统而异,实际上 Windows 默认使用其中两个,我尝试在 Windows 上使用 istream::ignore 和 2 作为参数,那是忽略新行的唯一方法,我得出的结论是,这是因为 Windows 使用两个字符作为新行标记。这意味着它不能在 Linux 上运行,而且它必须更复杂......再次 - 对初学者不利。
【问题讨论】:
-
你试过什么?请显示您目前拥有的代码,以便人们可以帮助修复/改进它的特定部分。
-
“新行字符因系统而异” - 解决方法是以字符模式而不是二进制模式打开文件。然后无论本地换行序列是什么,它都会在读取时转换为
\n。 -
您只需要初始字符串,还是要解析整行,包括数字?如果您想要后者,我会采用整体方法。
-
“换行符因系统而异”——也许它们在存储在磁盘上时会有所不同,但在您的 C++ 程序中并没有区别。
'\n'总是代表一行的结束,其他什么都没有。 -
@SteveJessop 和 Rob 有两种 istream 函数 - 格式化和未格式化。他们的行为不同。