gpt4 book ai didi

c++ - fread() 调用后的段错误

转载 作者:行者123 更新时间:2023-11-30 04:05:35 25 4
gpt4 key购买 nike

我有以下代码:

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;
}

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

File Open: t.bin

Data Read -- Num Bytes: 10

Segmentation fault (core dumped)

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

This is a test.

98172398172837129837

alsjdf89u32ijofiou2

TEST TEST...

!!## TESTING TEST!! ###(DLKAJ)

当我运行 gdb 时,段错误输出是:

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;

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

最佳答案

你需要一个缓冲区,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;
}

如果您所做的只是从文件中读取 char,您应该考虑使用 string

关于c++ - fread() 调用后的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23234734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com