首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存文件返回内存

内存文件返回内存
EN

Stack Overflow用户
提问于 2014-03-27 13:15:03
回答 2查看 109关注 0票数 0

我尝试将数据从内存写入文件。把它读回来,然后写回记忆里。目前,我有下面的代码。但据我所知,它并没有完全发挥作用。内存中的数据是图像。只要我不从文件里读出来就行了。但我一读到它就被腐蚀了。

代码语言:javascript
复制
        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

但这并不能完全奏效。我看到数据被破坏了,但我看不出为什么有人会看到我犯的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-27 13:18:36

试着使用

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

而不是

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

可能会解决你的问题,而且会更快。此外,fscanf和fprintf设计用于读取/写入格式化数据,而不是二进制字段。

票数 2
EN

Stack Overflow用户

发布于 2014-03-27 13:17:59

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

考虑到您已经用C++标记了这一点,您可以简单地以C++的方式执行I/O:

代码语言:javascript
复制
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*,并消除所有手动分配和取消分配。然后,代码将简化如下:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22688809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档