открытие нескольких файлов с помощью цикла в c

#arrays #c #loops #text-files #fopen

#массивы #c #циклы #текстовые файлы #fopen

Вопрос:

у меня есть три файла, file1.txt , file2.txt , file3.txt , и я хотел бы открывать их в цикле, чтобы я мог выполнять операции с каждым файлом через цикл. использую ли я массивы? как я могу это сделать? в настоящее время мой код открывает только один файл, и он выглядит так:

 char filename[] = "file1.txt", record[100];
FILE *fPtr;
fPtr = fopen(filename, "r");

     while (fgets(record, 100, fPtr))
     {
      //code where i look for certain strings in the file
     }
fclose (fPtr);
  

можно ли fPtr открыть эти 3 файла, один за другим закрываются, чтобы все 3 файла можно было перебирать для выполнения некоторых операций? был бы признателен, если бы кто-нибудь мог объяснить, как это сделать.

Комментарии:

1. Повторите цикл 1 , 2 и 3 и используйте snprint для создания имени файла?

2. Привет, какую операцию вы собираетесь выполнять со всеми файлами? Это одно и то же или зависит от файла?

Ответ №1:

Я думаю, вы должны быть в состоянии справиться с этим, повторяя их в цикле. Допустим, у вас есть эти три файла:

 src : $ cat file1.txt 
StackOverflow is cool
src : $ cat file2.txt 
I use StackOverflow daily
src : $ cat file3.txt 
I use Github daily
src : $ cat file4.txt
I use StackO
verflow on weekends 
  

Вы можете поместить имена файлов в массив следующим образом:

 char fileNames[3][10] = { "file1.txt", "file2.txt", "file3.txt", "file4.txt"};
  

Я заметил из комментария, что вы хотите выполнить поиск некоторых строк в этих файлах. В качестве примера, если я хочу выполнить поиск строки «StackOverflow» в этих файлах, я могу просто перебрать их и вызвать метод поиска, который будет искать предоставленную строку при предоставлении указателя на файл и строку для поиска. Вот как это будет выглядеть:

 char searchStr[] = "StackOverflow";

for (int i = 0; i < 4; i  ) {
  FILE *pFile = fopen(fileNames[i], "r");
  bool bExists = searchInFile(pFile, searchStr);
  if (bExists) {
    printf("%s contains %sn", fileNames[i], searchStr);
  }
  fclose(pFile);
}
  

Вы можете извлечь общую логику для поиска файла в searchInFile методе:

 bool searchInFile(FILE *pFile, char *str) {
  char buffer[1024]; // buffer to read whole file in memory
  char temp[100]; // temporary buffer to read line

  buffer[0] = ''; // Initialize empty string
  while (fgets(temp, 100, pFile) != NULL) {
      temp[strlen(temp) - 1] = '';
      strcat(buffer, temp); // Concatenate lines into single string
  }

  return strstr(buffer, str) != NULL; // Search for target string
}
  

Мой вывод, когда я запускал приведенный выше код:

 file1.txt contains StackOverflow
file2.txt contains StackOverflow
file4.txt contains StackOverflow
  

Комментарии:

1. Остерегайтесь ложных отрицаний , когда строка поиска встречается на границе: т.Е. 1-е fgets() чтение "... ... ...StackO" , 2-е чтение "verflow... ... ..." .

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

3. Есть еще пара «что, если»… просто сообщаю вам и OP, что, возможно, вы решите оставить код как есть (он достаточно хорош для большинства целей) … 1) файл больше буфера 2) файл не заканчивается новой строкой, т. Е. "...flow"<EOF> Не обычным "...flown"<EOF>

4. о, большое спасибо, что нашли время для просмотра!

5. Я считаю, что файлы, заканчивающиеся без финала 'n' , гораздо чаще встречаются в Windows, чем в Un * x