#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