如何将字符串转换为 uint32_t [重复]

Posted

技术标签:

【中文标题】如何将字符串转换为 uint32_t [重复]【英文标题】:How to convert a string to uint32_t [duplicate] 【发布时间】:2019-12-06 19:02:57 【问题描述】:

我有一个程序,它逐行读取文件的内容,将每一行存储到字符串向量中,然后打印向量的内容。

将文件数据读入字符串向量后,我尝试将每一行从string 转换为uint32。文件的每一行由32-bit 数字组成。输入数据文件(input_file.dat)的示例:

31401402
67662718
74620743
54690001
14530874
13263047
84662943
09732679
13839873

我想将这些字符串中的每一个转换为uint32_t,用于我编写的将这些数字转换为 ASCII 格式的不同程序(该程序要求 uint32_t 用于转换)。

到目前为止我的程序:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

/*
 * Program to iterate through all lines in file and put them in given vector
 *
 */
bool getFileContent(std::string fileName, std::vector<std::string> & vecOfStrs)


    // Open the File
    std::ifstream in(fileName.c_str());

    // Check if object is valid
    if(!in)
    
        std::cerr << "Cannot open the File : "<<fileName<<std::endl;
        return false;
    

    std::string str;
    // Read the next line from File untill it reaches the end.
    while (std::getline(in, str))
    
        // Line contains string of length > 0 then save it in vector
        if(str.size() > 0)
            vecOfStrs.push_back(str);
    
    //Close The File
    in.close();
    return true;



int main()

    //Store contents in this vector of strings
    std::vector<std::string> vecOfStr;

    // Get the contents of file in a vector
    bool result = getFileContent("input_file.dat", vecOfStr);

    // If above result is true
    if(result)
    
        // Iterate through the vector contents
        for(std::string & line : vecOfStr)
        
            //std::cout<<line<<std::endl;      Ignore this print line, it is for debugging only to show that the vector has been correctly filled

            //For each line, convert from string to uint32_t
            std::vector<std::uint32_t>new_variable
            new_variable.assign(vecOfStr.begin(), vecOfStr.end());

        
    

在我上面的尝试中,在注释下方的 for 循环中,“// 遍历向量内容”,我尝试使用 vector::assign 将每一行从 string 转换为 uint32_t功能。我在研究我的问题时这样做了,并从另一个 SO 问题中找到了这个函数:fastest way to convert a std::vector to another std::vector(作者:Vlad,2011 年 10 月 26 日 7:36 回答)。当我尝试运行此代码时,我收到以下 error 消息:

error: cannot convert ‘std::__cxx11::basic_string<char>’ to ‘unsigned int’ in initialization

总结:

如何逐行读取文件内容,并将每一行转换为数据类型uint32_t?我确保每一行都等于 32 位。

【问题讨论】:

std::stoi 和朋友? 并将字符串向量转换为整数向量std::transform 或者如果文件中只有数字,那么std::istream_iterator将数据直接从文件复制到整数向量中。 你说的是什么意思,我保证每一行都是32位的。?每个数字都需要32位来表示吗? 所以文件中的所有数字都在[2147483648, 4294967295]的范围内? 【参考方案1】:

这样

std::vector<std::uint32_t> new_variable;
for (string str : vecOfStr)
    new_variable.push_back(static_cast<uint32_t>(std::stoul(str)));

stoul 函数将字符串转换为整数。严格来说,它转换为unsigned long 而不是uint32_t。但是uint32_t 的所有合法值都可以用unsigned long 表示,并且演员转换回你想要的uint32_t

还有其他方法(例如使用std::transform),但我发现显式循环更简单。

上面的代码没有错误检查。如果有必要,最好使用类似 artm 的答案。

顺便说一句,您的尝试失败了,因为stringuint32_t 之间没有隐式转换。当存在隐式转换时,您尝试的方法将起作用。

【讨论】:

uint32_t &gt; int32_t。你会有溢出问题。 希望现在已修复。 不需要演员阵容,但肯定更好。 @NathanOliver 警告,我讨厌警告 一个挑剔:for (string str : vecOfStr) -> for (string const&amp; str : vecOfStr) 以避免复制。【参考方案2】:

使用stringstream 进行格式化,您需要包含&lt;stringstream&gt;

还有:

new_variable 移到循环之外,否则生成的vector 将无用

不需要传递vecOfStrs 作为参考。最好只按值返回vector

        std::vector<std::uint32_t> new_variable;

        for(std::string & line : vecOfStr)
        
            //For each line, convert from string to uint32_t

            std::stringstream ss(line);
            uint32_t val;
            if( !( ss >> val ) )
            
                throw std::runtime_error( "failed to convert to uint32" );
            
            
            std::cout << "val = " << val << '\n';   
            new_variable.push_back( val );
        

【讨论】:

也许向量声明应该在循环之外 原始代码,但是是的,否则它在该循环之外没有任何用处。

以上是关于如何将字符串转换为 uint32_t [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Arduino 在 uint32_t 和无符号字符之间转换

如何将 uint32_t 数字转换为 char[8]?

如何在 Neon 中将 uint32x4_t 转换为 uint8x16_t?

如何以优雅有效的方式将无符号/有符号整数/长整数转换为 C 字符串?

将 char 数组转换为 uint16_t 数组 C/C++

如何将字符数组转换为 uint8_t