【问题标题】:C Language Cat Program that Opens File from User Input从用户输入打开文件的 C 语言 Cat 程序
【发布时间】:2018-02-22 23:41:19
【问题描述】:

基本上,这个程序试图实现一个简单的 C 版本的 UNIX cat 命令。它只会显示一个文件,如果正确完成,它应该能够在命令行上执行一个包含需要显示的名称的命令行参数。我试图作为参考的一些问题是“如何使用用户输入连续写入文件?C 语言”、“从用户输入创建文件”和“用 c 语言完全打开文件”。但是,这些对我没有多大帮助,因为一个文件在用光标选择时想要打开,另一个是另一种语言,最后一个有点难以理解,因为我不在那个级别然而。以下是我迄今为止的代码,如果你们都能够借给我任何建议,我将不胜感激!

#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 30

int main (int argc, char** argv)
{
    File *stream;
    char filename[MAX_LEN];

    printf("File Name: ");
    scanf("%s", filename);
    stream = fopen(filename, "r");

    while(1)
    {
        fgets(stream);
        if(!feof(stream))
        {
            printf("%s", "The file you entered could not be opened\n");
            break;
        }
    }
    printf("To continue press a key...\n");
    getchar();
    fclose(stream);
    return 0;
}

【问题讨论】:

  • 您的程序不显示该文件,并且它以错误的方式和错误的顺序进行错误检查,您的问题并没有真正的问题。如果你看过其他类似的问题,link 到他们,而不是仅仅写他们的标题。请花点时间联系take the SO tourread about how to ask good questions
  • 文件名应该是argv[1],你需要检查argc是2
  • 顺便说一句,编译时包含所有警告和调试信息:gcc -Wall -Wextra -g
  • 我认为该代码甚至无法编译。尝试让它编译,并且没有警告(使用-Wall -Wextra 来启用警告)。或者如果你不能让它编译,你可以询问你无法修复的错误。此外,请阅读您使用的函数的文档(如fgets)。此外,检查返回值是否有错误是个好主意,这将有助于找出代码何时编译和运行但没有做正确的事情。

标签: c linux file unix cat


【解决方案1】:

如果您的目标是在 Linux 下重新编写 cat 函数,则此代码使用 Linux 下的 open、close 和 read 系统调用来满足您的目的。

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

#define BUFFER_SIZE 50

int main(int argc, char **argv)
{
  int   file;
  char  buffer[BUFFER_SIZE];
  int   read_size;

  if (argc < 2)
    {
      fprintf(stderr, "Error: usage: ./cat filename\n");
      return (-1);
    }
  file = open(argv[1], O_RDONLY);
  if (file == -1)
    {
      fprintf(stderr, "Error: %s: file not found\n", argv[1]);
      return (-1);
    }
  while ((read_size = read(file, buffer, BUFFER_SIZE)) > 0)
    write(1, &buffer, read_size);

  close(file);
  return (0);
}

在这段代码中,您可以看到错误检查是通过验证系统调用不会返回 -1 来完成的(在 linux 下,系统调用通常会在出错的情况下返回 -1)。

希望对你有帮助

【讨论】:

  • 不要混合char 缓冲区和字符串,它们是完全不同的东西。
  • @basile,您能否解释一下我的错误,以帮助我在将来避免它?
  • memset 这里不需要。
  • 第一次使用前memset缓冲区不是更干净吗?确实不需要第二个,我将编辑我的答案
  • @BasileStarynkevitch 告诉某人阅读整本书并不是很有帮助。哪个部分或页面?您在哪里看到混合了字符串和字符缓冲区?我所看到的只是正在读取并打印到标准输出的二进制数据块。也许代码已经改变,原来的问题不存在了,但更好的参考仍然很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2016-01-24
  • 2019-07-07
  • 1970-01-01
  • 2015-05-01
  • 2014-05-04
相关资源
最近更新 更多