对于类,我得到了这个,"开发一个C程序,将输入文件复制到输出文件并计算读/写操作的数量。我知道如何将输入文件复制到输出文件的操作,但我不完全确定如何跟踪执行了多少读/写操作。该程序应该使用不同的缓冲区大小重复复制,并输出每个缓冲区大小执行的读/写操作数的列表。我只是不确定如何计算 r/w 操作的部分。怎么能做到这一点呢?提前谢谢你。
这是我当前的代码(更新):
#include <stdio.h>
#include "apue.h"
#include <fcntl.h>
#define BUFFSIZE 1
int main(void)
{
int n;
char buf[BUFFSIZE];
int input_file;
int output_file;
int readCount = 0;
int writeCount = 0;
input_file = open("test.txt", O_RDONLY);
if(input_file < 0)
{
printf("could not open file.n");
}
output_file = creat("output.txt", FILE_MODE);
if(output_file < 0)
{
printf("error with output file.n");
}
while((n = read(input_file, buf, BUFFSIZE)) > 0)
{
readCount++;
if(write(output_file, buf, n) == n){
writeCount++;
}else{
printf("Error writing");
}
}
if(n < 0)
{
printf("reading error");
}
printf("read/write count: %dn", writeCount + readCount);
printf("read = %dn", readCount);
printf("write = %dn", writeCount);
}
而对于文本文件:测试一二
结果是:
read/write count: 26
read = 13
write = 13
Process returned 0 (0x0) execution time : 0.003 s
Press ENTER to continue.
我以为写的应该是12......但我不确定...
每次调用执行读取或写入的函数时,都需要递增一个变量。您可以通过创建一个包装标准 I/O 函数的函数来做到这一点。
例如,将 fread 替换为以下内容:
size_t fread_count(void *p, size_t size, size_t num, FILE *f){
iocount++;
return fread(p, size, num, f);
}
IOCOUNT 必须在范围内(例如全局)
如果需要分别计算读取和写入,请使用单独的变量。一个为读取递增,另一个递增用于写入。-编辑-由于您使用的是 write() 和 read(),因此您可以轻松地制作一个等效的功能与上面类似,但使用写入和读取而不是 fwrite 和 fread
以帮助尝试不同的缓冲区大小:
1) 将打开/读/写/关闭和字符缓冲区[]、读/写计数器、计数器的最终 printf 语句等放入一个单独的函数中
2) 在 main() 中,添加一个包含要尝试的缓冲区大小的表。
3) 从 main() 调用新函数, 包括指示要使用的缓冲区大小的参数