gpt4 book ai didi

c++ - fwrite 在 C++ 中的工作

转载 作者:搜寻专家 更新时间:2023-10-31 00:17:13 24 4
gpt4 key购买 nike

我试图在写入文件时模拟竞争条件。这就是我正在做的。

  1. 在 process1 中以附加模式打开 a.txt
  2. 在进程 1 中编写“hello world”
  3. 打印 process1 中的 ftell 为 11
  4. 让process1进入休眠状态
  5. 在process2中以追加方式再次打开a.txt
  6. 在 process2 中写入“hello world”(这正确地附加到文件末尾)
  7. 打印 process2 中的 ftell 为 22(正确)
  8. 在 process2 中写入“bye world”(这正确地附加到文件末尾)。
  9. process2 退出
  10. process1 恢复,并打印其 ftell 值,即 11。
  11. 由 process1 写入“bye world”——我假设 process1 的 ftell 是 11,这应该会覆盖文件。

但是process1的写入是写到文件末尾,进程之间没有写入竞争。

我将 fopen 用作 fopen("./a.txt", "a+)

谁能告诉我为什么会出现这种行为,我如何在写入文件时模拟竞争条件?

进程1的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include "time.h"
using namespace std;
int main()
{

FILE *f1= fopen("./a.txt","a+");
cout<<"opened file1"<<endl;
string data ("hello world");
fwrite(data.c_str(), sizeof(char), data.size(), f1);
fflush(f1);
cout<<"file1 tell "<<ftell(f1)<<endl;
cout<<"wrote file1"<<endl;
sleep(3);
string data1 ("bye world");;
cout<<"wrote file1 end"<<endl;
cout<<"file1 2nd tell "<<ftell(f1)<<endl;
fwrite(data1.c_str(), sizeof(char), data1.size(), f1);
cout<<"file1 2nd tell "<<ftell(f1)<<endl;
fflush(f1);
return 0;
}

在process2中,我已经注释掉了sleep语句

我正在使用以下脚本来运行:

./process1 &
sleep 2
./process2 &

感谢您的宝贵时间。

最佳答案

作者代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BLOCKSIZE 1000000

int main(int argc, char **argv)
{
FILE *f = fopen("a.txt", "a+");
char *block = malloc(BLOCKSIZE);

if (argc < 2)
{
fprintf(stderr, "need argument\n");
}
memset(block, argv[1][0], BLOCKSIZE);
for(int i = 0; i < 3000; i++)
{
fwrite(block, sizeof(char), BLOCKSIZE, f);
}
fclose(f);
}

阅读器函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BLOCKSIZE 1000000

int main(int argc, char **argv)
{
FILE *f = fopen("a.txt", "r");
int c;
int oldc = 0;
int rl = 0;

while((c = fgetc(f)) != EOF)
{
if (c != oldc)
{
if (rl)
{
printf("Got %d of %c\n", rl, oldc);
}
oldc = c;
rl = 0;
}
rl++;
}

fclose(f);
}

我运行了 ./writefile A & ./writefile B 然后 ./readfile

我明白了:

Got 1000999424 of A
Got 999424 of B
Got 999424 of A
Got 4096 of B
Got 4096 of A
Got 995328 of B
Got 995328 of A
Got 4096 of B
Got 4096 of A
Got 995328 of B
Got 995328 of A
Got 4096 of B
Got 4096 of A
Got 995328 of B
Got 995328 of A
Got 4096 of B
Got 4096 of A
Got 995328 of B
Got 995328 of A
Got 4096 of B
Got 4096 of A
Got 995328 of B
Got 995328 of A

如您所见,A 和 B 的长度很长,但它们的长度不完全是 1000000 个字符,这是我编写的大小。整个文件,在第一次运行较小的试运行后,只有不到 7GB。

供引用:Fedora Core 16,我自己编译的 3.7rc5 内核,gcc 4.6.3,x86-64 和 lvm 之上的 ext4,AMD PhenomII 四核处理器,16GB RAM

关于c++ - fwrite 在 C++ 中的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13999138/

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