2011-10-15 73 views
1

我有一个任务,要求我使用缓冲的I/O复制文件。它有多种要求:寻找一个字符串复制到缓冲区

  1. 取一个参数和一个可选的第二
  2. 打开第一读取
  3. 打开第二个写
  4. 参数如果没有第二个参数创建一个名为PROG1新文件.OUT
  5. 使用的20个字节
  6. 缓冲器大小在复制文件时,打印任何缓冲开始以字符“rwxr”
  7. CLO在退出之前查看所有打开的文件。

我遇到的问题是数字6,我环顾四周,无法弄清楚这一点。我尝试过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); 
} 

回答

0

还有用简单的方式:

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'字节结束,否则字符串函数不知道何时停止。

+0

好的,我明白了。非常感谢你,我想我会尝试使用strncmp()。我仍然在努力尽可能多地学习C语言。 – sjhaw

0

我会先回答你实际询问的问题:memcmp是比较两个缓冲区的好方法。一些注意事项:

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

因此,举例来说,如果你想看看是否有缓冲区等于字符串“rwxw”,你可以写

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

个人而言,我会用一个“#定义”或为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); 
} 
相关问题