Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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++ 文件读取停止_C++_Memory Management_Buffer_Readfile - Fatal编程技术网

C++ 文件读取停止

C++ 文件读取停止,c++,memory-management,buffer,readfile,C++,Memory Management,Buffer,Readfile,当我试图读取大文件(~412MB)时,文件突然停止读取。这个程序运行了一个月,但现在我出现了错误。我不知道为什么。你能帮忙吗?当我用Purify检查它时,它说程序的内存分配失败 s.write(block, f.gcount()); 我正在将一个大文件写入缓冲区(我正在读取一大块文件)。然后我解析这个缓冲区并读取文件的下一部分。我试图用更少的片段读取文件,但结果是一样的:程序只是停止读取,然后什么也不做。没有任何异常(我试图捕获std::exception) 原因是什么?你能帮忙吗 该文件非

当我试图读取大文件(~412MB)时,文件突然停止读取。这个程序运行了一个月,但现在我出现了错误。我不知道为什么。你能帮忙吗?当我用Purify检查它时,它说程序的内存分配失败

 s.write(block, f.gcount());
我正在将一个大文件写入缓冲区(我正在读取一大块文件)。然后我解析这个缓冲区并读取文件的下一部分。我试图用更少的片段读取文件,但结果是一样的:程序只是停止读取,然后什么也不做。没有任何异常(我试图捕获std::exception) 原因是什么?你能帮忙吗

该文件非常简单:

p edge 45 45

e 4 1 

e 5 6
等等

代码如下:

   readFile(char name[]) {
       ifstream f;
       f.open(name,ifstream::binary);
       char buffer[256], token[20];
       int i, j, k, tmp;
       int vi = 0, vj = 0;
       int num_edges = 0;

       if (! f.is_open()) 
       { 
            cout << "Error opening file: " << name << endl; 
            //_getch();
        exit(1); 
       }

       strstream s;
       static const int N = 1024*1024;
       char block[N];


    while (! f.eof() ) 
    {
        s.clear();
        f.read(block, N);
        s.write(block, f.gcount());

        while (! s.eof())
        {
            s.getline(buffer, 250);
            if (s.eof())
            {
                s.write(buffer, s.gcount());
                break;
            }

            if (buffer[0] == 'c')
            {
                continue;
            }

            if (buffer[0] == 'p') 
            {
                cout << buffer << endl;
                sscanf(&buffer[7], "%d", &globalColouredVertices.size);

                if(globalColouredVertices.size > MAX_VERTICES) {
                    cout << "Too many vertices (> " << MAX_VERTICES << ")"<< endl;
                    exit(2);
                }

                //e.resize(globalColouredVertices.size);
                for (i = 0; i < globalColouredVertices.size; i++)
                {
                    globalColouredVertices.ele[i].point = i;
                }
            }
            if (buffer[0] == 'e') 
            {
                num_edges++;
                i = 2;
                j = 0;
                while ((buffer[i] >= '0') && (buffer[i] <= '9')) 
                { 
                    token[j++] = buffer[i];
                    i++; 
                }
                token[j] = '\0';
                vi = atoi(token);
                i++;
                j = 0;
                while ((buffer[i] >= '0') && (buffer[i] <= '9')) 
                { 
                    token[j++] = buffer[i];
                    i++; 
                }
                token[j] = '\0';
                vj = atoi(token);
                vi--;
                vj--;
                e[vi][vj] = 1;
                e[vj][vi] = 1;
            }

            if (num_edges % 10000 == 0)
                cout << num_edges << endl;
            else if (num_edges %  24380000 == 0) {
                cout << endl;
            }
        }
    }
 }
readFile(字符名[]){
IFF流;
f、 打开(名称,ifstream::binary);
字符缓冲区[256],令牌[20];
int i,j,k,tmp;
int vi=0,vj=0;
int num_边=0;
如果(!f.是开的())
{ 

cout这可能不是您看到的问题,但您的代码中存在两个潜在的缓冲区溢出。例如:

while ((buffer[i] >= '0') && (buffer[i] <= '9')) 
{ 
    token[j++] = buffer[i];
    i++; 
}

while((buffer[i]>='0')&&(buffer[i]这可能不是您看到的问题,但是您的代码中存在一些潜在的缓冲区溢出。例如:

while ((buffer[i] >= '0') && (buffer[i] <= '9')) 
{ 
    token[j++] = buffer[i];
    i++; 
}

while((buffer[i]>='0')&&(buffer[i]您使用strstream
作为缓冲区是不必要的

这段代码将在strstream中放入一部分行。因此,当您稍后逐行阅读它时,您可能会在每个缓冲区的末尾得到一个不完整的行,然后在下一个缓冲区的开头得到另一个不完整的行

    f.read(block, N);
    s.write(block, f.gcount());
再加上代码中没有任何数组绑定检查(特别是这个代码段和其他人提到的代码段),这意味着这是一场即将发生的车祸

            e[vi][vj] = 1;
            e[vj][vi] = 1;
我强烈推荐你

  • 答:完全移除stream缓冲区
  • 请考虑使用 std::vector,而不是手动分配缓冲区
  • c:那你就可以了 使用
    at()
    函数进行边界检查访问,这将引发 例外情况

在完成之前,不要担心优化或性能。

使用strstream
作为缓冲区是不必要的

这段代码将在strstream中放入一部分行。因此,当您稍后逐行阅读它时,您可能会在每个缓冲区的末尾得到一个不完整的行,然后在下一个缓冲区的开头得到另一个不完整的行

    f.read(block, N);
    s.write(block, f.gcount());
再加上代码中没有任何数组绑定检查(特别是这个代码段和其他人提到的代码段),这意味着这是一场即将发生的车祸

            e[vi][vj] = 1;
            e[vj][vi] = 1;
我强烈推荐你

  • 答:完全移除stream缓冲区
  • 请考虑使用 std::vector,而不是手动分配缓冲区
  • c:那你就可以了 使用
    at()
    函数进行边界检查访问,这将引发 例外情况

在完成之前,不要担心优化或性能。

谢谢,我会在数组中添加边界检查。但我使用它是因为我需要良好的性能。因为实验结果表明vector的效果比array差。@user565447“过早优化是万恶之源”Donald Knuth,1974是的,我同意。但我需要它。这不是一个商业项目。这是为了科学。谢谢,我将在数组中添加边界检查。但我使用它是因为我需要良好的性能。因为实验结果表明向量的效果比数组差。@user565447“过早优化是万恶之源”唐纳德·克努斯,1974年是的,我同意。但我需要它。这不是一个商业项目。它是为了科学而做的。