Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中常数字符的读取 如果字符串不超过20个字符,那么它将如何读取,并且可以在C++中包含空格?例如,我有这样的文件: 3 Namama 4 5 12 Cool 4 2 34 Not So Cool 4 2 45_C++_String_Spaces_Istream - Fatal编程技术网

C++中常数字符的读取 如果字符串不超过20个字符,那么它将如何读取,并且可以在C++中包含空格?例如,我有这样的文件: 3 Namama 4 5 12 Cool 4 2 34 Not So Cool 4 2 45

C++中常数字符的读取 如果字符串不超过20个字符,那么它将如何读取,并且可以在C++中包含空格?例如,我有这样的文件: 3 Namama 4 5 12 Cool 4 2 34 Not So Cool 4 2 45,c++,string,spaces,istream,C++,String,Spaces,Istream,我想用最基本的方式写。在这种情况下,我更希望只使用C++无C thiges。这意味着我想将其存储在std::string中 char name[21]; std::cin.read(name, 20); std::string nameString(name); // If you want it in a std::string 我可以使用istream::get或istream::getline,但是我必须避免使用新行字符。这是有问题的,我正在编写的代码将向初学者展示 你对这个问题的解决方

我想用最基本的方式写。在这种情况下,我更希望只使用C++无C thiges。这意味着我想将其存储在std::string中

char name[21];
std::cin.read(name, 20);
std::string nameString(name); // If you want it in a std::string
我可以使用istream::get或istream::getline,但是我必须避免使用新行字符。这是有问题的,我正在编写的代码将向初学者展示

你对这个问题的解决方案是什么

编辑:

正如我被问到的,我将告诉你我已经尝试了什么,但我认为这不会有任何好处。我不是C++初学者,通常我会使用一些类似于ISTRAM::get和char数组,但是删除新行字符对某些人来说可能太过技巧了。 所以。。。使用istream::operator>>读取字符数组或std::string失败,因为当他们看到空格字符时,它会停止读取,并且我可能需要读取多个单词。这意味着以下代码失败:

char name[21];
std::cin >> name;
或者


另一件事是新行字符因系统而异,实际上Windows默认使用其中两个字符,我尝试在Windows上使用istream::ignore和2作为参数,这是忽略新行的唯一方法,我得出结论,这是因为Windows使用两个字符作为新行标记。这意味着它不能在Linux上工作,而且必须更加复杂。。。同样-对初学者来说不好。

如果你想准确阅读20个字符

for(int i=0; i<3; ++i) {
    std::string result;
    int one, two, three;

    result.resize(20);
    if (!std::cin.read(&result[0], 20)) throw std::runtime_error("reading buffer failed!");

    if (!std::cin >> one >> two >> three) throw std::runtime_error("reading numbers failed!");
    if (!std::cin.ignore(1000, '\n')) throw std::runtime_error("ignore failed!");
}

如果您不想要正好20个字符,那么如何知道何时到达字符串的末尾?

实现这一点的一种方法是使用istream::read到足够大小的临时缓冲区中,然后使用该缓冲区初始化std::string

char name[21];
std::cin.read(name, 20);
std::string nameString(name); // If you want it in a std::string

这正好可以读取20个字符、换行符和所有内容。如果是为了锻炼,那么这至少是非常简单的。如果有时需要少于20个字符,可以通过std::istream::unget或等效工具确定读取了多少额外字符并返回get指针。

您尝试了什么?请显示迄今为止您拥有的代码,以便人们能够帮助修复/改进其中的特定部分。新行字符因系统而异-修复方法是以字符模式而不是二进制模式打开文件。然后,无论本地换行符序列是什么,它都会在读取时转换为\n。您是只需要初始字符串,还是要分析整行,包括数字?如果你想要后者,我会采取一种整体的方式。新线字符不同于系统到系统——也许他们在磁盘上存储时做,但是在C++程序中它们没有差别。n'总是表示一行的结尾,其他任何东西都不表示。@SteveJessop和Rob有两种istream函数-格式化函数和未格式化函数。它们的行为有所不同。没有使用iostream::read,但引用说它是一个未格式化的输入函数,这不意味着它将读取上次读取后留下的新行字符吗?我仍然必须使用istream::ignore。无论如何,我会在几分钟内尝试minutes@Valdo当前位置我又把它改成20读,弄糊涂了。这将在20个字符后留下任何内容,包括换行符。但它也会读取换行符。事实上,它导致了一些非常奇怪的行为,我不明白,但我试图弄明白。我一直认为这个函数是用于二进制读取的,只记得用过它,但显然没有。@Valdo:它应该精确读取20个字节,包括空格和换行符。wierd的行为是什么?@Mooning Duck嗯,它在读取输入时会导致错误。在读取第一行之后,它无法读取以下行。。。现在正试图找出问题所在。。。