gpt4 book ai didi

Copy-Program 适用于小文件,在较大文件上会出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:58:43 25 4
gpt4 key购买 nike

为了学习一些低级的 C 魔法,我尝试实现不同的方法来将一个文件的内容复制到另一个文件。

以下方法使用缓冲区,我在其中保存数据 block ,例如512 字节。然后我从这个缓冲区写入我的目标文件。据称这比直接复制整个文件效率更高。

当我使用小缓冲区时,例如512 字节,这很好用。如果我使用大缓冲区,例如10000000 字节,大约 10MB,出现段错误。

我在 Ubuntu 上运行。我用 malloc 尝试过一些东西,但没有什么适合我的。我想修复会很容易,一旦我知道了。

根据我的调试器,错误在这一行:

if (stat(to, &statBuffer) == -1)

我遗漏了很多我正在做的错误检查。这是我运行的代码:

void copyUsingBuffer(char from[], char to[], long unsigned int bufferSize)
{
struct stat statBuffer;
int sourceFD, destFD;
char buffer[bufferSize / sizeof(char)];
int EndOfFileErreicht = 0;

// Dateien pruefen
if (stat(to, &statBuffer) == -1)
{
if (errno != ENOENT)
{
perror("Fehler beim Pruefen der Zieldatei");
exit(EXIT_FAILURE);
}
}
else
{
if (!(S_ISREG(statBuffer.st_mode)))
{
printf("Die Zieldatei ist keine regulaere Datei\n");
exit(EXIT_FAILURE);
}
}

// Dateien oeffnen
sourceFD = open(from, O_RDONLY);
if (sourceFD == -1)
{
perror("Fehler beim Oeffnen der Quelldatei");
exit(EXIT_FAILURE);
}
if (fstat(sourceFD, &statBuffer) == -1)
{
perror("Fehler beim Pruefen der Quelldatei");
exit(EXIT_FAILURE);
}
if (!(S_ISREG(statBuffer.st_mode)))
{
printf("Die Quelldatei ist keine regulaere Datei\n");
exit(EXIT_FAILURE);
}

destFD = open(to, O_WRONLY | O_CREAT | O_TRUNC, statBuffer.st_mode);
if (destFD == -1)
{
perror("Fehler beim Oeffnen der Zieldatei");
exit(EXIT_FAILURE);
}

while (EndOfFileErreicht == 0)
{
int geleseneBytes = read(sourceFD, buffer, sizeof(buffer));
if (geleseneBytes == -1)
{
perror("Fehler beim Lesen aus der Quelldatei");
exit(EXIT_FAILURE);
}
if (geleseneBytes < bufferSize)
{
// EOF wurde erreicht, also Flag setzen
EndOfFileErreicht = 1;
}


if (write(destFD, buffer, geleseneBytes) == -1)
{
perror("Fehler beim Schreiben in die Zieldatei");
exit(EXIT_FAILURE);
}
}

close(sourceFD);
close(destFD);
}

我希望如果我输入一个 500MB 的文本文件,我的程序会将该文件复制到它的目的地。

我意识到有不同的方法来实现文件复制。我已经实现了其中一些。在这种情况下,我只能使用写入、读取和缓冲区。 bufferSize 也需要成为一个变量。我使用 malloc 的天真方式是:

 char* buffer = malloc(bufferSize);

但是当我使用它时文件会损坏。

最佳答案

在尝试了一些事情之后找到了解决方案。我替换

char buffer[bufferSize / sizeof(char)];

char* buffer = malloc(bufferSize);

已经有人建议使用 malloc。我的错误是我没有更换

int geleseneBytes = read(sourceFD, buffer, sizeof(buffer));

进行这些更改我的程序适用于所有文件大小。感谢大家的帮助!

int geleseneBytes = read(sourceFD, buffer, bufferSize);

关于Copy-Program 适用于小文件,在较大文件上会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56760306/

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