Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ 直接读入std::字符串是否有任何问题?_C++_String - Fatal编程技术网

C++ 直接读入std::字符串是否有任何问题?

C++ 直接读入std::字符串是否有任何问题?,c++,string,C++,String,我在代码中看到了对std::string的直接读取,其中的内容被解释为字符串,如下所示: std::string note; note.resize(n); read( &note[0], n ); 假设n的大小是固定的,就像在解析场景中一样 直接读入字符串是否有任何问题?我已经看到了ifstreams的很多用法,但在这种情况下它似乎太过了。这样看待它:“可能发生的最坏情况是什么?” 您是否正在从本地用户获取文件?如果他们提供了一个太大的文件,也许他们的机器会重击,甚至会因为内存不足错

我在代码中看到了对
std::string
的直接读取,其中的内容被解释为字符串,如下所示:

std::string note;
note.resize(n);
read( &note[0], n );
假设n的大小是固定的,就像在解析场景中一样


直接读入字符串是否有任何问题?我已经看到了ifstreams的很多用法,但在这种情况下它似乎太过了。

这样看待它:“可能发生的最坏情况是什么?”

您是否正在从本地用户获取文件?如果他们提供了一个太大的文件,也许他们的机器会重击,甚至会因为内存不足错误而杀死你的程序

您是否希望用户经常这样做,以防担心

或者:


您是从网络源获取文件还是从不受信任的用户获取文件?让该用户有可能破坏您的系统或杀死您的应用程序会构成风险吗?

首先,如果它是由几行组成的文本文件,我发现
std::string
类不是作为“容器”的好选择;我更喜欢一个
std::vector
,或者如果您想做一些额外的解析并将文件分解成单行,那么就选择一个
std::vector

我还要注意文件使用的编码:是UTF-8吗?它是基于字符的编码吗

例如,如果文件是UTF-16,则将其作为原始字节序列读入
std::string
将非常容易产生误导(并且容易出现错误)


此外,还必须注意文件的大小。如果您有一个巨大的文本文件(例如5GB),并且您正在构建一个32位Windows应用程序,那么您的代码将无法工作(因为Windows上的32位进程默认限制为2GB)。在这种情况下,以较小的块读取文件内容(或使用内存映射文件技术,在文件上具有较小的“视图”)可能是更好的选择。

基本上与将其读入
char
缓冲区相同。如果你确信你的缓冲区足够大,它就没有问题。这取决于用例。如果数据不是一个字符串,那么你可能需要考虑一个<代码> STD::向量< /代码>,这样你就不会对自己撒谎了。有一些技术适合于实现特定的目标,也有一些技术不适合于特定的原因。不要再考虑最佳实践,像工程师一样思考。@SergeyA我明白你的意思。“良好的实践,我的意思是,在这种情况下,有没有具体的理由不这样做呢?”纳萨诺利弗,谢谢。我已经澄清了解释为字符串的意图。在回答您的提示时,我发现以下内容部分解决了我的问题。谢谢。我没有考虑编码。