【问题标题】:Segfault after fread() callfread() 调用后的段错误
【发布时间】:2014-04-23 04:27:19
【问题描述】:

我有以下代码:

char*
Sender::PrepareData(char* filename, unsigned long long int bytesToTransfer)
{
    FILE* dataFile = fopen(filename, "rb"); 
    if (dataFile==NULL) {fputs ("File error",stderr); exit (1);}

    cout << "File Open: " << filename << endl;

    char* theData;
    size_t bytesRead = fread(&theData, 1, bytesToTransfer, dataFile);
    if (bytesRead != bytesToTransfer) {fputs ("Reading error",stderr); exit (3);}

    cout << "Data Read -- Num Bytes: " << bytesRead << endl;
    cout << "Data to Send: " << *theData << endl;

    return theData;
}

当这个方法被命中时,我的输出是:

文件打开:t.bin

数据读取——字节数:10

分段错误(核心转储)

我的t.bin 文件包含以下内容:

这是一个测试。

98172398172837129837

alsjdf89u32ijofiou2

测试测试...

!!## 测试测试!! ###(DLKAJ)

当我运行 gdb 时,segfault 输出是:

File Open: t.bin Data Read -- Num Bytes: 10

Program received signal SIGSEGV, Segmentation fault. 0x00000000004015e2 in Sender::PrepareData (this=0x603010, filename=0x7fffffffe363 "t.bin", bytesToTransfer=10)
    at sender.cpp:98  98        cout << "Data to Send: " << *theData << endl;

谁能告诉我我做错了什么?

【问题讨论】:

  • cout

标签: c++ gcc file-io fread


【解决方案1】:

你需要一个缓冲区,theData 只是一个指针。

类似

char theData[1000];
size_t bytesRead = fread(theData, 1, bytesToTransfer, dataFile);

可能会根据bytesToTransfer 的最大值起作用

如果您确定您正在读取一个字符串,您可能还需要在写入cout 之前终止theData

theData[bytesRead] = '\0';

如果要返回缓冲区,则需要在堆上分配缓冲区。

这样做会容易得多

std::vector<char>
PrepareData(char* filename, unsigned long long int bytesToTransfer)
{
  std::ifstream file(filename, file.binary);

  if (!file) {
    std::cerr << "File error";
    exit(1);
  }

  std::cout << "File Open: " << filename << '\n';

  std::vector<char> data(bytesToTransfer + 1);
  file.read(data.data(), bytesToTransfer);
  data.back() = '\0';

  if (!file) {
    std::cerr << "Reading error";
    exit(3);
  }

  std::cout << "Data Read -- Num Bytes: " << bytesToTransfer << '\n';
  std::cout << "Data to Send: " << data.data() << '\n';
  return data;
}

如果您所做的只是从文件中读取chars,您可能应该考虑使用strings。

【讨论】:

  • 为什么cplusplus 使用char * buffer
  • @MrDuk 你错过了一步buffer = (char*) malloc (sizeof(char)*lSize);
  • @MrDuk - 在这种情况下,mmap 它并完全避免分配和/或复制。
  • @MrDuk 你确定你已经把fread(&amp;theData 改成了fread(theData 吗?无论哪种方式,您都应该考虑返回 vector,请参阅我的编辑。
  • @jww heyoo,Beej 甚至有 a guide 使用 mmap - 谢谢
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 2017-08-02
  • 2013-09-16
  • 2011-03-13
  • 2013-02-26
  • 2016-07-16
  • 2022-01-14
  • 2014-08-16
相关资源
最近更新 更多