How to convert a string to uint32_t

18,887

Like this

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

The stoul function converts to string to the integer. Strictly it converts to an unsigned long not a uint32_t. But all legal values of uint32_t can be represented by an unsigned long and a cast converts back to the uint32_t that you want.

There's other ways (using std::transform for instance), but I find an explicit loop to be simpler.

There's no error checking in the code above. If that's necessary something like artm's answer is preferable.

BTW your attempt failed because there's no implicit conversion between a string and a uint32_t. When there is an implicit conversion then what you tried would work.

Share:
18,887
p.luck
Author by

p.luck

Updated on June 04, 2022

Comments

  • p.luck
    p.luck almost 2 years

    I have a program which reads the contents of a file line by line, stores each line into a vector of strings, and then prints the contents of the vector.

    After reading the file data into the vector of strings, I am attempting to convert each line from string into uint32. Each line of the file consists of 32-bit numbers. An example of the input data file (input_file.dat):

    31401402
    67662718
    74620743
    54690001
    14530874
    13263047
    84662943
    09732679
    13839873
    

    I would like to convert each of those strings into uint32_t, for a different program I have written which converts these numbers into ASCII format (the program requires that uint32_t is used for conversion).

    My program so far:

    #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());
    
            }
        }
    }
    

    In my above attempt, in the for loop underneath the comment which reads "// Iterate through the vector contents", I have attempted to convert each line from a string to uint32_t using the vector::assign function. I did this when researching my problem, and found this function from another SO question: fastest way to convert a std::vector to another std::vector (author: Vlad, answered Oct 26 '11 at 7:36). When I try to run this code, I receive the following error message:

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

    TO SUMMARISE:

    How can I read the contents of a file line by line, and convert each line into the data type uint32_t? I have ensured that each line is equal to 32-bits.

  • NathanOliver
    NathanOliver almost 5 years
    uint32_t > int32_t. You'll have overflow issues with this.
  • john
    john almost 5 years
    Fixed now I hope.
  • NathanOliver
    NathanOliver almost 5 years
    The cast is not needed, but its definitely better.
  • john
    john almost 5 years
    @NathanOliver warnings, i hate warnings
  • Ari0nhh
    Ari0nhh almost 5 years
    Perhaps vector declaration should be outside the loop
  • NathanOliver
    NathanOliver almost 5 years
    One nit pick: for (string str : vecOfStr) -> for (string const& str : vecOfStr) to avoid copying.
  • artm
    artm almost 5 years
    Original code, but yes, otherwise it'd not be any useful outside that loop.
  • acegs
    acegs almost 5 years
    for(auto const& str : vecOfStr) for more maintainable.