繁体   English   中英

C:读入多个文件

[英]C: read in more than one file

大家好,使用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个文件退出后,我将如何继续执行下一个文件)。

请您协助我进入下一阶段? 谢谢。

背景

argv[0]是程序的名称。

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

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

等等

所以:

  1. 1而不是0开始循环(即j=0不正确)。
  2. 确保在读取文件之后和打开下一个文件之前立即关闭文件。

算法

在编写代码之前,请先考虑一下算法。

  1. 将counter设置为第一个参数的索引。
  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语法时遇到问题,请搜索教程。 例如:

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

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

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

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

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

fopen(argv[2], ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM