C: читать более одного файла - PullRequest
1 голос
/ 20 декабря 2010

Эй, ребята, используя системные вызовы POSIX API read, write, open и т. Д. Я могу открывать, читать, записывать в файл и копировать его содержимое в выходной файл.Как мне скопировать более одного файла в выходной файл, используя только связанные системные вызовы?

В настоящее время у меня есть:

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

, чтобы открыть один файл (это argv1, но яЯ хотел бы знать, как делать argv2, argv3 и т. д.)

Я пытался:

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

, но это выводит содержимое argv0 в мой выходной файл.

Iя застрял на следующем этапе, чтобы сделать больше, чем один файл.(У меня также есть цикл EOF, поэтому после выхода из 1 файла - Как бы я продолжил это для следующего файла).

Пожалуйста, не могли бы вы помочь мне с подходом к следующему этапу?Спасибо.

Ответы [ 4 ]

4 голосов
/ 20 декабря 2010

Фон

argv[0] - название программы.

argv[1] - это параметр командной строки 1 st .

argv[2] - это параметр командной строки 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, запись One

Этот алгоритм немного сложнее, но устраняет избыточность.

  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, поищите учебники. Например:

2 голосов
/ 20 декабря 2010

Используйте цикл, чтобы прочитать все файлы.Начните с 1, чтобы пропустить текущий выполняющийся процесс, который находится в argv [0].

for(int i = 1; i < argc; ++i)
{
    int filein = open(argv[i],O_RDONLY,0);
    // ... process file
    close(filein)
}
1 голос
/ 20 декабря 2010

чтобы открыть один файл. (Это argv1, но я хотел бы знать, как делать argv2, argv3 и т.

fopen(argv[2], ...)

1 голос
/ 20 декабря 2010

argv [0] - название программы. argv [1] является первым, после чего вы передаете командную строку.

Откройте ваш выходной файл, а затем каждый входной файл. прочитайте каждый входной файл в выходной файл, затем закройте их все и выйдите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...