【问题标题】:Looking for a string of characters copied to a buffer寻找复制到缓冲区的字符串
【发布时间】:2011-10-15 00:36:44
【问题描述】:

我有一个任务要求我使用缓冲 i/o 复制文件。它有多个要求:

  1. 采用一个参数和一个可选的第二个参数
  2. 打开第一个参数进行读取
  3. 打开第二个写
  4. 如果没有第二个参数,则创建一个名为 prog1.out 的新文件
  5. 使用 20 字节大小的缓冲区
  6. 复制文件时,打印任何以字符“rwxr”开头的缓冲区
  7. 退出前关闭所有打开的文件。

我遇到的问题是六号,我环顾四周,无法弄清楚。我已经尝试过 memchr,但我认为我没有走在正确的轨道上。如果有人能帮助我朝着正确的方向前进,我将不胜感激。

这是我的代码:

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

int main(int argc, char *argv[])
{

    FILE *readfile, *writefile;
    char buffer[1024];
    int fileSize;
    int readResult;
    int writeResult;

    // making sure arguments exist
    if (argc < 2|| argc > 3){
            printf("This program takes either 1 or 2 arguments.\n");
            exit(1);
    }

    //Opening file for reading
    readfile = fopen(argv[1], "r");
    if (!readfile) {
            printf("Unable to open file %s.\n", argv[1]);
            exit(1);
    }

    //finding the file size
    fseek (readfile, 0, SEEK_END);
    fileSize = ftell (readfile);
    fseek (readfile, 0, SEEK_SET);

    // read the file
    readResult = fread(buffer, 20, fileSize/20, readfile);
    if (readResult == 0) {
            printf("A read error occured.\n");
            exit(1);
    }

    //check to see if there is a second parameter (argument)
    if (argc == 3) {
            writefile = fopen(argv[2], "w");

            if (!writefile) {
                    printf("Unable to open file  %s.\n", argv[2]);
                    exit(1);
            }

            writeResult = fwrite(buffer, 20, fileSize/20, writefile);
            if (writeResult != readResult) {
                    printf("A write error occured.\n");
                    exit(1);
            }
            printf("File %s successfully copied to %s.\n", argv[1], argv[2]);
    }
    else {
            writefile = fopen("program1.out", "w");

            if (!writefile) {
                    printf("Unable to open file program1.out\n");
                    exit(1);
            }

            writeResult = fwrite(buffer, 20, fileSize/20, writefile);
            if (writeResult != readResult) {
                    printf("A write error occured.\n");
                    exit(1);
            }
            printf("File %s successfully copied to %s.\n", argv[1], "program1.out
    }
    fclose(readfile);
    fclose(writefile);
    exit(0);
}

【问题讨论】:

    标签: c string search buffer


    【解决方案1】:

    有一种天真的方式:

    if(buffer[0] == 'r' && buffer[1] == 'w' 
       && buffer[2] == 'x' && buffer[3] == 'r') {
       //do something
    }
    

    但是看看strncmp(),您可以使用它来比较字符串的各个部分。

    • 记得首先检查您是否已将至少 4 个字符读入缓冲区。例如如果文件长 21 个字节,则您的 2. fread 可能只读取 1 个字符,并且您不应与缓冲区中的其他 3 个字符进行比较。

    • 如果您使用例如打印出缓冲区printf 或 puts 或任何其他需要字符串的函数,缓冲区需要以 '\0' 字节结尾,否则字符串函数不知道何时停止。

    【讨论】:

    • 好的,我明白了。非常感谢,我想我会尝试使用 strncmp()。我仍在努力学习尽可能多的 C。
    【解决方案2】:

    我将首先回答您实际提出的问题:memcmp 是比较两个缓冲区的好方法。一些警告:

    • 您还必须确保缓冲区的大小至少与目标字符串的大小一样大
    • 如果两个缓冲区匹配,memcmp 返回 0,这可能违反直觉。

    例如,如果您想查看缓冲区是否等于字符串“rwxw”,您可以编写

    if (readresult >= strlen("rwxw") && !memcmp(buffer, "rwxw", strlen("rwxw"))) {
        // buffer match occurred!
    }
    

    我个人会使用“#define”或 const char 来确保该字符串出现的三个位置实际上是同一个字符串。例如:

    #define MATCH_STRING "rwxw"
    
    if (readresult >= strlen(MATCH_STRING) && !memcmp(buffer, MATCH_STRING, strlen(MATCH_STRING))) {
        // buffer match occurred!
    }
    

    但是,您的代码还存在一些其他问题。一个是您需要一个循环,该循环不断地从输入文件读取并从输出文件写入,直到输入耗尽。例如,沿着

    while (true) {
        readResult = fread(buffer, 20, 1, readfile);
    
        if (readResult == 0) {
            // end of file
            break;
        }
    
        // put your check for the "rwxr" string here!
    
        writeResult = fwrite(buffer, readResult, 1, writefile);
    
        if (writeResult != readREsult) {
            printf("error\n");
        }
    }
    

    最后,您遇到了可能被称为“风格”的错误。您的程序中有两种情况:指定文件名和默认文件名。这两个案例有很多共同的代码,但是你做了一个剪切和粘贴。这使代码更难理解,并且如果将来更改,更容易出现错误。如果您正在剪切和粘贴代码,那么您做错了什么!请考虑这样的事情,它可以最大化共享代码路径:

    char *outFileName;
    
    if (argc == 3) {
         outFileName = argv[2];
    } else {
         outFileName = "prog1.out";
    }  
    
    writefile = fopen(outFileName, "w"); 
    
    if (!writefile) {
       printf("Unable to open file %s.\n", writeFileName);
       exit(1);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 2012-07-17
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      相关资源
      最近更新 更多