- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
文件的副本包含原始文件的所有内容以及类似“\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 时停止。但通常,这通常是错误的情况,因为人们想要变量中的返回值。所以你的陈述看起来不对。
现已修复。
非常慢,即使有 fread/fwrite 提供的缓冲。处理大小适中的缓冲区 block 要快得多。缓冲区应该有多大取决于您的硬件,但 4K 或 8K 是一个很好的开始。当然,在您的特定应用程序中,您可能希望让线程有事可做,而不是将所有内容复制成一个大块。
通常是错误的,除非(任何)==(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/
什么时候使用 fp:strict 而不是 fp:precise?如果我想要“更精确”的计算并避免舍入误差,使用前者是否更好?使用这两者背后的启发是什么? 最佳答案 标准 IEEE 754 指定了一种用
我检测到发布版本和调试版本之间的程序结果存在一些差异。经过一些研究,我意识到一些浮点优化导致了这些差异。我已经通过使用 fenv_access pragma 禁用一些关键方法的优化来解决了这个问题。
我在 Built-in Functions — Python 3.7.0 documentation 中阅读了内置函数 iter 的示例 with open('mydata.txt') as fp:
我在 Built-in Functions — Python 3.7.0 documentation 中阅读了内置函数 iter 的示例 with open('mydata.txt') as fp:
我一直在查找一些用 C 语言读取文件的例子,我看到了这两个例子 fgets(buff,255,(FILE*)fp); 和 fgets(buff,255,fp); 假设 fp 是前面定义的文件指针 "F
我是 FP-TS 的新手,但仍然不太明白如何使用 TaskEither .我正在尝试异步读取文件,然后使用 yaml-parse-promise 解析结果字符串。 ==编辑== 我用文件的完整内容更新
我需要在我的 Mac 上编译一个 C 文件,该文件是在仅假设 Linux 和 GCC 环境下编写的。该文件包含一行 if(fp->_IO_write_base == fp->_IO_write_end
for line in fp 和 for line in fp.readlines() 有什么区别? with open(filename, 'r') as fp : for line in
这可能非常无聊,但谷歌搜索确实没有帮助。 在python官方文档中,它经常将文件称为fp: with open(filename, "w") as fp: fp.write() “p”代表什么? 最佳
我想知道如果我设置/fp:fast 而不是 fp:precise 会遇到什么样的错误?我在 MSV10 下工作 我对最大位数为 8 的 double 执行/,*,+,- 运算,例如 1.4379294
我正在使用 Groovy 进行一个项目,我想采用一个员工数组,这样在数组中没有经理跟随他们的下属。原因是我需要将人员添加到数据库中,我不希望分两次完成。 所以,我基本上有: 12
背景: 许多年前,我继承了一个代码库,该代码库使用 Visual Studio (VC++) 标志“/fp:fast”在特定的计算量大的库中生成更快的代码。不幸的是,'/fp:fast' 产生的结果与
我正在尝试从PostgreSQL数据库检索数据,将其转换为视图模型数组,并将数据返回给客户端,在本例中最好是作为单个对象,而不是数组。对于我在错误消息下面列出的代码,我收到以下错误。我是函数式编程领域
所以我尝试将此类 Matlab 代码转换为 C++: ss = 'file.mask' fp = fopen(ss, 'rb'); sx = fread(fp, 1, 'int32') sy = f
我是fp-ts的新手,请帮助我解决问题: 我需要使用异步功能在不同级别上多次记录同一错误。这是我的示例代码: const myProgram = pipe( tryCatch(() => so
我正在尝试在为浏览器编写的库中使用 lodash/fp。我正在使用 Webpack 来打包我的库。 在我的代码中,我当前加载 lodash/fp 如下(ES2015 样式。我使用 Babel 对其进行
我的问题是引用 this post ,具体来说: data Actions a = Actions { actEval :: a, actMap :: (a -> a) -> Act
我正在阅读 FP,我有两个基本问题: FP 表示函数应该接受一个输入并给出单个输出。那么我该怎么办void方法?它不返回任何东西吗? FP 说函数应该是单一的 责任,那我们怎么处理log方法内的语句?
我是 c 初学者,所以我在让用户输入姓氏、逗号和名字时遇到问题。但是它将传递给函数调用 int get_name(FILE *fp) 在我的主要功能中。如果我必须使用参数参数,我就会遇到问题。 示例,
我有一些这样的序列 (100) - (102) - (103) - (104,106) - (108) (101) - (103) (102) - (106) 在 C++ 中有一些有效的实现前缀树或
我是一名优秀的程序员,十分优秀!