对于类I,我得到了这个,"开发一个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: %d\n", writeCount + readCount);
printf("read = %d\n", readCount);
printf("write = %d\n", writeCount);
}
对于文本文件:test one two
结果是:
read/write count: 26
read = 13
write = 13
Process returned 0 (0x0) execution time : 0.003 s
Press ENTER to continue.
我当时认为写作会是12 ......但我不确定......
答案 0 :(得分:0)
每次调用执行读取或写入的函数时,都需要递增变量。你可以通过创建一个包含标准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(),所以你可以轻松地创建一个等价物 功能如上,但使用write和read代替fwrite和fread
答案 1 :(得分:0)
帮助尝试不同的缓冲区大小:
1)将open / read / write / close和char buffer [],读/写计数器,计数器的final printf语句等放入一个单独的函数中
2)在main()中,添加一个包含要尝试的缓冲区大小的表。
3)从main()调用新函数, 包括一个指示要使用的缓冲区大小的参数