C ++ ftell分段错误

时间:2014-03-23 07:46:18

标签: c++ struct segmentation-fault binaryfiles fread

我正在尝试从二进制文件中读取数据。我得到了一个包含所有变量的结构来提取数据。我正在使用fread函数,我需要将文件的总大小作为freads输入之一。我正在使用ftell函数来查找大小,但是当我调用ftell函数时,我遇到了分段错误。

这是我的代码:

#include<iostream>
#include<fstream>
#include<stdio.h>
using namespace std;

struct header{
  int so_on; 
  int so_forth;
  int etc;
};

int main(){
  FILE *fin;
  header cvvHeader;
  fin=fopen("file.binaryextension","r");
  int headersize= sizeof(header);
  header* ptr=&cvvHeader;
  long filesize =ftell (fin); //Segmentation fault happens here
  fread(ptr,headersize,filesize,fin);
}

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

以下代码产生问题,您需要检查fin是有效还是NULL。

fin=fopen("file.binaryextension","r");
//....code
long filesize =ftell (fin); //Segmentation fault happens here



// fin should be non-null pointer when file is successfully opened. 
if(fin) {
  long filesize =ftell (fin); 
  }

答案 1 :(得分:0)

有几个问题:

  1. 要打开文件file.binaryextension进行阅读,您需要将其置于正确的路径中:

    如果您直接运行程序(例如,通过单击它或从命令行调用它),那么它应该与可执行文件位于相同的路径中。

    如果从Visual Studio运行程序,则路径通常是vcproj文件所在的位置。或者,您可以在项目设置中更改路径本身。

  2. 为了获得文件的大小:

    致电fseek(fin,0,SEEK_END)

    致电long filesize = ftell(fin)

    致电fseek(fin,0,SEEK_SET)

  3. 为了从文件中读取标题数据:

    致电fread(ptr,headersize,1,fin)

  4. 为了从文件中读取剩余数据:

    致电char* data = (char*)malloc(filesize-headersize)

    致电fread(data,filesize-headersize,1,fin)

    使用完毕后致电free(data)