C++ std::stoi超出范围。从文件转换

C++ std::stoi超出范围。从文件转换,c++,file,indexoutofrangeexception,C++,File,Indexoutofrangeexception,我试图打印文件中每一行上指示的行,但在使用std::stoi时返回超出范围的异常。文本文件每行有一个数字,从第一行的10到最后的0。这就是为什么我不明白为什么它超出范围,因为它应该与int一起工作,所以32位 这是我的密码: if (myfile.is_open()){ while ( getline (myfile,line) ){ DirLine = myfile.tellg(); myfile.seekg(0,0); i=0;

我试图打印文件中每一行上指示的行,但在使用std::stoi时返回超出范围的异常。文本文件每行有一个数字,从第一行的10到最后的0。这就是为什么我不明白为什么它超出范围,因为它应该与int一起工作,所以32位

这是我的密码:

  if (myfile.is_open()){
    while ( getline (myfile,line) ){
        DirLine = myfile.tellg();
        myfile.seekg(0,0);
        i=0;
        lines = line;
        while (fl){
            j = std::stoi(lines,nullptr,10);
            if (j == i){
                cout << lines <<" - "<<j << '\n';
                myfile.seekg(0,DirLine);
                fl = false;
            }
            getline(myfile,lines);
            i++;
        }
    }
    myfile.close();
  } 
  else cout << "Unable to open file";
if(myfile.is_open()){
while(getline(myfile,line)){
DirLine=myfile.tellg();
seekg(0,0);
i=0;
线条=线条;
while(fl){
j=std::stoi(行,空ptr,10);
如果(j==i){
试试这个

  • 传递一个字符串参数stoi(行)
  • 如果它不起作用

  • 把这个放在stoi之前:line.append(“”)
  • 如果还是错误的话

    string::size_type sz;
    stoi(lines,sz);
    
    我认为问题是,在stoi返回值之前,stoi将尝试找到第一个数字的下一个字符的位置。并将其分配给指针,如果数字后面没有字符,则指针将越界。
    因此,您可以通过追加任何字符来提供额外的索引,或者尝试使用单个参数。

    尝试使用std::stoul()函数。它解析无符号的长值,并且可能具有更大的范围(取决于CPU/OS)。在Windows上,我在没有索引参数的情况下解析时遇到问题,因此它看起来可能像
    std::stoul(第0行)
    。std::stoull也存在于无符号long-long中。

    我不确定您是否正确使用了…我正在使用并说应该使用
    seekg(偏移量,方向);
    …其中
    方向
    std::ios::beg
    std::ios::end
    ,或者
    std::ios::cur
    。我已经更改了
    myfile.seekg(0,0)
    to
    myfile.seekg(0,std::ios::beg);
    myfile.seekg(0,DirLine);
    to
    myfile.seekg(DirLine);
    和我在其他小程序中测试的
    seekg
    ,像这样工作正常
    myfile.seekg(DirLine,std::ios::beg);