Parsing positive integers from CSV file Part-2
Great that you renamed you function according to what it does. I would suggest, that you add a helper function that reads a single line. 

Creating small well encapsulated functions is key in writing maintainable code.

Regarding you code there are some small nits:


The code pattern

container[container.size() - 1] 


can alway be replaced by

container.back()

Regarding the parsing you could use std::string::find_first_of and search for the next occurence of it.

std::size_t first = 0;
std::size_t second;
while (first != buffer.size()) {
    second = buffer.find_first_of(",\r", first);
    // parse [first, second)
    first = second + 1;            
}


That way in the interval [first, second) there would always be the numbers and you would not have to replace the final character or other stuff
Again encapsulation. There is no reason why the this block of code is not inside its own function:

uint_fast16_t parsed_number = 0;
for (const auto&amp; digit : buffer) {
    if (digit == ',') {
        numbers.emplace_back(parsed_number);
        parsed_number = 0;
    }
    else {
        parsed_number = (parsed_number * 10) + (digit - '0');
    }
}


Even better if you encapsulate it you can easily adopt for iterators/positions

uint_fast16_t parse_number(cont std::string&amp; buffer, std::size_t first, std::size_t second) {
    uint_fast16_t parsed_number = 0;
    for (std::size_t i = first; i &lt; second; ++i) {
        parsed_number = (parsed_number * 10) + (buffer[i] - '0');
    }
    return parsed_number;
} 


Now you can write the loop as

while (infile.good() &amp;&amp; std::getline(infile, buffer)) {
    std::size_t first = 0;
    std::size_t second;
    while (first != buffer.size()) {
        second = buffer.find_first_of(",\r", first);
        numbers.push_back(parse_number(buffer, first,second));
        first = second + 1;            
    }
    callback(numbers);
    numbers.clear();
}


I would even suggest to create another function for parsing the single line:

void parse_single_line(std::string&amp; buffer, std::vector&lt;uint_fast16_t&gt;&amp; numbers) {
    std::size_t first = 0;
    std::size_t second;
    while (first != buffer.size()) {
        second = buffer.find_first_of(",\r", first);
        numbers.push_back(parse_number(buffer, first,second));
        first = second + 1;            
    }


Together this leads to

while (infile.good() &amp;&amp; std::getline(infile, buffer)) {
    parse_single_line(buffer, numbers);
    callback(numbers);
    numbers.clear();
}