c - 尝试编写计算指定文件中字节数的程序(C语言)

标签 c linux byte buffer 8-bit

我目前正在尝试编写一个程序,告诉用户指定的 8 位字节在指定文件中出现了多少次。

我已经做好了一些基础工作,但是当涉及到确保文件将其放入数组或缓冲区或我应该将文件数据放入以检查字节的任何格式时,我觉得我可能离使用正确的方法还很远。

之后,我需要检查指定字节中放入的文件数据,但我也不确定如何执行此操作。 我认为我可能把这件事变得过于复杂了,因此非常感谢解释任何需要更改或可以完全废弃的内容。

希望没有遗漏任何重要的细节。

一切似乎都在运行(此代码编译),但是当我尝试 printf 底部的最终语句时,它不会吐出该语句。 我有一种感觉,我根本没有正确设置最终的 for 循环..

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
//#define BUFFER_SIZE (4096)
main(int argc, char *argv[]){       //argc = arg count, argv = array of arguements

    char buffer[4096];
    int readBuffer;
    int b;
    int byteCount = 0;
    b = atoi(argv[2]);
    FILE *f = fopen(argv[1], "rb");

    unsigned long count = 0;
    int ch;

    if(argc!=3){                 /* required number of args = 3 */

        fprintf(stderr,"Too few/many arguements given.\n");
        fprintf(stderr, "Proper usage: ./bcount path byte\n");
        exit(0);
    }

    else{                       /*open and read file*/
        if(f == 0){
            fprintf(stderr, "File could not be opened.\n");
            exit(0);
        }



    }

    if((b <= -1) || (b >= 256)){            /*checks to see if the byte provided is between 0 & 255*/
        fprintf(stderr, "Byte provided must be between 0 and 255.\n");
        exit(0);
    }
    else{
        printf("Byte provided fits in range.\n");
    }

    int i = 0; 
    int k;
    int newFile[i];

    fseek(f, 0, SEEK_END);
    int lengthOfFile = ftell(f);


    for(k = 0; k < sizeof(buffer); k++){
        while(fgets(buffer, lengthOfFile, f) != NULL){
            newFile[i] = buffer[k];
            i++;
        }
    }

    if(newFile[i] = buffer[k]){
        printf("same size\n");
    }



    for(i = 0; i < sizeof(newFile); i++){
        if(b == newFile[i]){
            byteCount++;
        }
        printf("Final for loop is working???"\n");
    }


}

最佳答案

OP正在混合fgets()对文件进行二进制读取。

fgets()读取文件直至提供的缓冲区大小或达到 \n字节。它用于文本处理。通过 fgets() 确定读取了多少数据的典型方法就是寻找最终的\n - 可能存在也可能不存在。读取的数据可能嵌入了 NUL 字节,因此了解何时停止扫描缓冲区会出现问题。在 NUL 字节或 \n 上。

幸运的是,这一切都可以省去,包括文件查找和缓冲区。

// "rb" should be used when looking at a file in binary. C11 7.21.5.3 3
FILE *f = fopen(argv[1], "rb");  
b = atoi(argv[2]);
unsigned long byteCount = 0;
int ch;
while ((ch = fgetc(f)) != EOF) {
  if (ch == b) {
    byteCount++;
  }
}

OP 错误检查很好。但是for(k = 0; k < sizeof(buffer); k++){循环及其内容存在各种问题。 OP有if(b = newFile[i]){应该是if(b == newFile[i]){

关于c - 尝试编写计算指定文件中字节数的程序(C语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18648543/

相关文章:

c++ - std::bad_alloc 被抛出的其他可能原因

java - 从 inputStream 中读取字节的 Int 值

从不同文件调用时,C++ __TIME__ 是不同的

在 C 中连接变量名?

C套接字recv返回字节数但缓冲区中没有任何内容

linux - 如何在不更改代码的情况下为 Symfony2 设置 php CLI 版本?

linux - IBM HTTP 服务器无法访问资源目录

python - 将Keras模型HDF5文件存储到SQL数据库

algorithm - 如何在逐字节比较之前首先检查文件是否相等?

c - 递归二叉树给出内存访问错误