内存要归档回内存

时间:2014-03-27 13:15:03

标签: c++ c malloc

我尝试将内存中的数据写入文件。然后读回来并将其写回内存。 目前我有以下代码。但据我所知,它并没有完全发挥作用。存储器中的数据是图像。只要我不从文件中读取它就好了。但是一旦我读到它就会被破坏。

        size_t memsize = frameWidth * frameHeight;                      //calculate the memory size
    //Writing characters to file
    char test;

    char* data = (char*) malloc (memsize);                          //create a datablock for the data on the heap
    //*

    cudaMemcpy( data, input, memsize,cudaMemcpyDeviceToHost);       //copy the data form the cuda to the CPU
    FILE *fp;
    fp = fopen (filename, "wb");
    int frames = memsize/sizeof(char);
    for (int i = 0; i<(frames); i++)
    {
            test = data[i];
            fprintf(fp, "%c",test);
    }
    fclose (fp);
    /**/
    free(data);                                                     //clear the allocated memory

//////////////////////////////////////
//write back to the memory///////////
////////////////////////////////////
    data = (char*) malloc (memsize);                            //create a datablock for the data on the heap
    //*

//  FILE *fp;
    fp = fopen (filename, "rb"); //read


    for(int i=0; i<memsize; i++)
       fscanf(fp, "%c ", (data+i));

    cudaMemcpy( input, data, memsize,cudaMemcpyHostToDevice);       //copy the data form the cuda to the CPU
    log_kernel<<<grid, block>>>(input, pitchIn/sizeof(float), output, pitchOut/sizeof(float), frameHeight);

    fclose (fp);
    /**/
    free(data);

                                                    //clear the allocated memory

但这并不完全有效。我看到数据被破坏但我不明白为什么 谁能看到我犯的错误。

2 个答案:

答案 0 :(得分:2)

假设数据实际上是二进制而不是字符,其中一些数据很容易具有值3210或其他类似值。您正在使用"%c "读取文件,这意味着这些值(空格和换行的ASCII代码)将很快被跳过为空格。

看到你用C ++标记了它,你可以简单地用C ++方式进行I / O:

cudaMemcpy( data, input, memsize,cudaMemcpyDeviceToHost);
{
  std::ofstream f(filename, std::ios::binary);
  f.write(data, memsize);
}
free(data);

// And

{
  std::ifstream f(filename, std::ios::binary);
  f.read(data, memsize);
}
cudaMemcpy( input, data, memsize,cudaMemcpyHostToDevice);

当然,您也可以使用std::vector<char>代替char*,并取消所有手动分配和取消分配。然后代码将简化:

size_t memsize = frameWidth * frameHeight;
std::vector<char> data(memsize);
cudaMemcpy(&data[0], input, memsize,cudaMemcpyDeviceToHost);
{
  std::ofstream f(filename, std::ios::binary);
  f.write(&data[00, memsize);
}
data.clear();

// Now read back

data.resize(memsize);
{
  std::ifstream f(filename, std::ios::binary);
  f.read(&data[0], memsize);
}
cudaMemcpy( input, data, memsize,cudaMemcpyHostToDevice);

data.clear(); // optionally

答案 1 :(得分:2)

尝试使用

fread(data, sizeof(char), memsize, fp);

而不是

for(int i=0; i<memsize; i++) fscanf(fp, "%c ", (data+i));

可以解决您的问题并且会更快。 此外,fscanf和fprintf旨在读/写格式化数据,而不是二进制字段。