【问题标题】:C: read in more than one fileC:读入多个文件
【发布时间】:2010-12-21 00:21:13
【问题描述】:

大家好,使用 POSIX API 系统调用 readwriteopen 等。我可以打开、读取、写入文件并将其内容复制到输出文件。我将如何仅使用相关系统调用将多个文件复制到输出文件?

我目前有:

filein = open(argv[1],O_RDONLY,0);

打开一个文件。(这是 argv1,但我想知道如何执行 argv2 和 argv3 等)

我试过了:

j=0;
filein = open(argv[j],O_RDONLY,0);

但这会将 argv0 的内容打印到我的输出文件中。

我被困在下一阶段要做多个文件。 (我也有一个EOF 循环,所以在 1 个文件后它退出 - 我如何让这个继续为下一个文件)。

请您帮助我了解如何进入下一阶段?谢谢。

【问题讨论】:

  • 如果从j = 1开始呢?
  • 谢谢,是的,我明白这一点,但我想知道 j 是 2 还是 j 是 3,而不是单独复制。

标签: c posix


【解决方案1】:

背景

argv[0] 是程序的名称。

argv[1] 是第一个st 命令行参数。

argv[2] 是第二个nd 命令行参数。

等等

所以:

  1. 1 开始循环,而不是0(即j=0 不正确)。
  2. 请务必在读取文件后立即关闭文件,然后再打开下一个文件。

算法

在编写代码之前考虑算法。

  1. 将计数器设置为第一个参数的索引。
  2. 打开文件。
  3. 为打开的文件分配一个句柄。
  4. 读取文件内容。
  5. 写入(如果需要)文件内容。
  6. 使用句柄关闭文件。
  7. 增加计数器。
  8. 循环直到没有更多的命令行参数。

现在你可以编写代码了。

如果您包含错误处理,您可能会获得奖励积分。 (当文件丢失、不可读、文件系统损坏或机器内存或磁盘空间不足时会发生什么情况?)

连接文件

如果您想将两个文件名连接到第三个文件名,您需要重新考虑算法以及您需要什么。 “读取命令行中给出的前两个文件并将它们写入第三个文件”和“将命令行中给出的所有文件附加到给出的最后一个文件”之间是有区别的。

读二,写一

算法:

  1. 确保恰好有三个参数。
  2. 为第三个文件(输出)创建一个文件句柄变量。
  3. 为第一个文件(输入)创建一个文件句柄变量。
  4. 为第二个文件(输入)创建一个文件句柄变量。
  5. 打开第一个文件进行阅读。
  6. 打开第二个文件进行阅读。
  7. 打开第三个文件进行写入。
  8. 读取第一个文件的内容并将其写入第三个文件。
  9. 读取第二个文件的内容,写入第三个文件。
  10. 关闭第三个文件。
  11. 关闭第二个文件。
  12. 关闭第一个文件。

此时您会注意到很多冗余。

读 N,写一个

这个算法有点挑战性,但是去掉了冗余。

  1. 确保至少有两个参数。
  2. 打开最后一个文件进行写入。
  3. 循环遍历每个文件名,直到但不包括最后给出的文件名:
    1. 打开输入文件进行读取。
    2. 将文件内容写入最后一个文件。
    3. 关闭输入文件。
  4. 关闭输出文件。

为此,您需要了解argc 及其与argv 的关系。在伪代码中:

if number_of_arguments < 2 then
  print "This program concatenates files; two or more file names are required."
  exit
end

int outfile = open arguments[ number_of_arguments ] for writing
int j = 1

while j < number_of_arguments do
  int infile = open arguments[ j ] for reading
  string contents = read infile
  write contents to outfile
  close infile
  increment j
end

close outfile

教程

如果您在使用 C 语法时遇到问题,请搜索教程。例如:

【讨论】:

  • 谢谢你,我很感激所提供的建议。
  • @donok:不客气。祝你任务顺利。不要忘记评论您的代码。
  • 再次感谢,我了解 argc 和 argv,这个问题是一个更大计划的一部分,非常感谢您花时间帮助我解决这个问题。
【解决方案2】:

使用循环读取所有文件。从 1 开始跳过位于 argv[0] 的当前执行进程。

for(int i = 1; i < argc; ++i)
{
    int filein = open(argv[i],O_RDONLY,0);
    // ... process file
    close(filein)
}

【讨论】:

  • 哇,FILE* 和 open() 属于不同的 API。我想应该是int
  • 谢谢,在此之后我如何将例如 file1 和 file2 复制到我的输出文件中,我只能执行 file1。 (而且我想使用 POSIX API 系统调用,例如 open read write 而不是 fopen 我知道你在上面写的部分如何,只是不超过一个文件。)
【解决方案3】:

argv[0] 是程序的名称。 argv[1] 是第一个然后你在命令行上传递。

打开您的输出文件,然后打开每个输入文件。将每个输入文件读入输出文件,然后全部关闭并退出。

【讨论】:

  • 谢谢你的回复我就是这样打开输入文件,打开输出文件,然后进行读写,我想这可能是我出错的地方。
【解决方案4】:

打开一个文件。(这是 argv1,但我想知道如何执行 argv2 和 argv3 等)

fopen(argv[2], ...)

【讨论】:

  • 谢谢,我明白该怎么做,我想复制多个文件,而不仅仅是 1 个。
猜你喜欢
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多