【问题标题】:How to keep track of how many read/write operations are performed...?如何跟踪执行了多少读/写操作......?
【发布时间】:2015-03-14 05:40:43
【问题描述】:

对于我的课程,“开发一个 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);

}

对于文本文件:测试一二

结果是:

read/write count: 26
read = 13
write = 13

Process returned 0 (0x0)   execution time : 0.003 s
Press ENTER to continue.

我原以为写的是 12...但我不确定...

【问题讨论】:

  • 缺少代码#include
  • 所有读/写操作完成后,贴出的代码无法关闭文件。
  • main() 函数声明它返回一个 int,但是,代码缺少“返回值”;声明
  • 'FILE_MODE' 正在使用,但从未定义
  • 编译时,始终启用所有警告,然后修复警告。警告来自编译器的指示,表明编译器认为某些代码可能是错误的

标签: c file-io buffer read-write


【解决方案1】:

每次调用读取或写入的函数时,都需要增加一个变量。您可以通过制作一个包装标准 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? @smeezekitty
  • 这些提议的函数可以/应该有另一个参数,即计数器的地址,那么计数器不需要是“全局”(实际上是使用“静态”修饰符来文件全局)跨度>
  • @PhilectorIV 我认为应该是 25。每个字节读取一个,每个字节写入一个。还有一个用于在文件末尾尝试读取的额外内容
  • @user3629249 你是对的。从长远来看,这将是一种更好的方法,以避免代码被全局变量弄乱。为简单起见,我使用了全局变量示例。但是使用指针会是更好的通用编码实践。
【解决方案2】:

帮助尝试不同的缓冲区大小:

1) 将 open/read/write/close 和 char buffer[]、读/写计数器、计数器的最终 printf 语句等放入单独的函数中

2) 在 main() 中,添加一个包含要尝试的缓冲区大小的表。

3) 从 main() 调用新函数, 包括一个指示要使用的缓冲区大小的参数

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2016-06-20
    • 2020-04-04
    • 2011-01-03
    • 1970-01-01
    相关资源
    最近更新 更多