gpt4 book ai didi

使用 fopen(fp ,"wb") 创建用户输入的任何文件的副本

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:04 26 4
gpt4 key购买 nike

文件的副本包含原始文件的所有内容以及类似“\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\”。此外,它只对 txt 文件给出错误,其他文件格式很容易被复制。我之前也尝试过使用 fread 和 fwrite,但后来没有出现任何此类问题。有没有我试错的东西。它说我打开的文件包含一些无效字符,以防它是文本文件。

  char strr[1];
int e;
bzero(strr,1);
while((e=(fread(strr,1,1,fpp)))>0)
{
fwrite(strr,1,1,bck);
i++;
}
if(e>0)
{
fclose(bck);
}

我认为问题出在上面的代码上。我也添加了整个代码。请不要评论多线程部分,我知道当我使用互斥体时它是无用的并且它不会减少任何时间。有很多工作要做。请你帮我解决上述问题。提前致谢。

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int counter;
static FILE * fpp;
static FILE * bck;
pthread_mutex_t lock;
int wc;
int flag;
int lent;
unsigned long fsize(char* file)
{
FILE * f = fopen(file, "rb+");
fseek(f, 0, SEEK_END);
unsigned long len = (unsigned long)ftell(f);
fclose(f);
return len;
}
void* doSomeThing(void* arg)
{
pthread_mutex_lock(&lock);
char str;
int i=0;
counter++;
char buff[100];
bzero(buff,100);
char strr[1];
int e;
bzero(strr,1);
while(((e=(fread(strr,1,1,fpp)))>0) || i<=lent)
{
fwrite(strr,1,1,bck);
i++;
}
if(e>0)
{
fclose(bck);
}
pthread_mutex_unlock(&lock);
return NULL;
}

int main()

{
int i = 0;
int err;

char filn[100];
printf("\nEnter Filename:");
scanf("%s",filn);
unsigned long len= fsize(filn);
lent=(int) len;
lent=lent/5;
printf("%lu",len);
char backf[100];
printf("\nEnter Filename to copy");
scanf("%s",backf);
bck=fopen(backf,"wb+");
fpp=fopen(filn,"rb+");
pthread_t tid[6];
pthread_t * temp;
fseek(fpp, 0, SEEK_SET);
if (pthread_mutex_init(&lock, NULL)!=0)
{
printf("\n mutex init failed\n");
return 1;
}
for(i=0;i<6;i++)
err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
//if (err != 0);
int j=0;
for(j=0;j<6;j++)
{
pthread_join(tid[j], NULL);
}
printf("\n%d",wc-1);
pthread_mutex_destroy(&lock);
//fclose(bck);
fclose(fpp);
return 0;
}

最佳答案

while (e=(fread(strr,1,1,fpp)>0) )  

括号错了。应该是

while ((e=fread(strr,1,1,fpp))>0)

此外,你的缩进太可怕了,一次读/写 1 个字节效率很低,而且 fclose 是错误的依赖于 if(e>0) ,但这都不是问题的原因。

括号

fread 返回读取的记录数(在您的例子中,字节数,因为记录大小为 1)。好像只要得到一个字节就想一直读下去。但是你的e=(fread..)>0先比较,然后把比较的结果赋值给e。在这种情况下这实际上是可以的,因为 fread 在这种特定情况下可以返回 1 或 0 - 并且您希望循环在返回值不是 1 时停止。但通常,这通常是错误的情况,因为人们想要变量中的返回值。所以你的陈述看起来不对。

缩进

现已修复。

一次读/写1个字节

非常慢,即使有 fread/fwrite 提供的缓冲。处理大小适中的缓冲区 block 要快得多。缓冲区应该有多大取决于您的硬件,但 4K 或 8K 是一个很好的开始。当然,在您的特定应用程序中,您可能希望让线程有事可做,而不是将所有内容复制成一个大块。

使 fclose 依赖于(任何)

通常是错误的,除非(任何)==(fopen 成功)。当您完成文件并且不想再使用它时,您可以将其关闭。期间。

在你的例子中,你有一个循环 while (e ... > 0) , 然后是 if (e>0) if 条件中的部分永远不会被执行,因为 if 永远不会达到 e>0 .所以你不要在任何地方关闭你的文件。 (在这种特定情况下,这是一件好事,因为后面的线程仍会访问它,但通常这是一个错误)。

线程

您原来的帖子根本没有提到 pthread 的东西。

按照你的使用方式,你的第一个线程会执行复制操作;发生这种情况时,其他线程会卡在互斥体中。在第一个线程释放互斥量后,其他线程之一将开始尝试复制文件。此时,输入文件的文件指针在 EOF,第一个线程停止的地方;下一个线程将尝试读取更多数据,失败,并将未修改、零初始化的 strr 写入备份文件。重复直到 i<lent部分变为假。所有其他线程都一样。这可能是您额外的 \000 的地方字节来自。顺便提一句。这表明发布所有内容是多么重要。您的原始帖子丢弃了 i<lent部分,并没有提到多线程,但这些正是导致您不希望的结果的关键点。

关于使用 fopen(fp ,"wb") 创建用户输入的任何文件的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21660377/

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