1

Тема: C, функція fopen для відкриття файлів у циклі

Яким чином правильно можна задати відкриття файлів у циклі?

Нехай спочатку відкриваємо файл х та беремо з нього список файлів, переписуємо цей список у char **name, далі

for (int i = 0; i++; i++)
{
  fopen(name(i), …);
}
i виявляється, що fopen не працює з таким name.

2 Востаннє редагувалося Bartash (07.12.2012 23:38:44)

Re: C, функція fopen для відкриття файлів у циклі

Використання std::vector, std::list може стати пігулкою. А імена самих файлів можна зберігати у std::string для зручності.

I belong to the Dead Generation.
Подякували: Ярослав1

3

Re: C, функція fopen для відкриття файлів у циклі

Так звичайно простіше, але потрібно саме на C або на спрощеному С++, без std функцій.

4

Re: C, функція fopen для відкриття файлів у циклі

1. Сформулюйте задачу ясніше.
2. Якщо маєте масив рядків char **names, то доступ до iName-рядка досягається шляхом names[iName].
Головне, щоб наприкінці кожного рядка тексту стояв термінатор ('\0').

I belong to the Dead Generation.
Подякували: Ярослав1

5

Re: C, функція fopen для відкриття файлів у циклі

У fopen перший аргумент повинний бути const char*, тому варіант з простою передачею names[iName] не проходить.

6

Re: C, функція fopen для відкриття файлів у циклі

Charlie написав:

У fopen перший аргумент повинний бути const char*, тому варіант з простою передачею names[iName] не проходить.

Ви, можливо, некоректно зрозуміли сутність "const char*" у даному випадку. Якщо аргумент функції має ознаку const, це означає, що у межах функції дані, що містяться у цій змінній, не будуть модифіковані. Однак це не накладає додаткових обмежень на змінну, що передається у якості параметра до функції. Гляньте оком: приклад коду (дещо умовний, але демонструє суть описаного вище).

#include <cstdio>
#include <cstring>

int main()
{
    char ** fileNames = new char* [10];
    for(int iFile = 0; iFile < 10; iFile++)
    {
        fileNames[iFile] = new char[20];
        sprintf(fileNames[iFile], "D:\\good_%d.txt",iFile+1);
        
        FILE *fp = fopen(fileNames[iFile],"w");
        fwrite(fileNames[iFile], strlen(fileNames[iFile]), 1, fp);
        fclose(fp);
    }
    
    
    for(int iFile = 0; iFile < 10; iFile++)
        if(fileNames[iFile])
            delete fileNames[iFile];
    
    delete []fileNames;
    
return 0;
}
I belong to the Dead Generation.
Подякували: Ярослав1

7

Re: C, функція fopen для відкриття файлів у циклі

Мені потрібно ось так зробити:

char** fileNames = new char*[150];
char bufMain[500];

FILE* fp = fopen("fileslist", "r")
for (int iFile = 0; iFile < 150; iFile++)
{
  fileNames[iFile] = new char[50];
  fgets(bufMain, sizeof(bufMain), fp);
  sprintf(fileNames[iFile], bufMain);
  FILE* fscp = fopen(fileNames[iFile], "r");
  fclose (fscp);
}

Незважаючи, на те що fileNames[iFile] містить правильне ім'я файлу, він не відкривається.

8

Re: C, функція fopen для відкриття файлів у циклі

Щось я втратив ниточку ідеї...

Якщо вам треба створити файли, назви яких лежать у вхідному файлі, то кожен з них слід створювати з fopen() "w" або "r+". Чи я не туди думаю?..

I belong to the Dead Generation.
Подякували: Ярослав1

9

Re: C, функція fopen для відкриття файлів у циклі

Створювати не потрібно, з них потрібно читати. Я не описував у цьому фрагменті, що з них читатиметься.

10 Востаннє редагувалося Bartash (08.12.2012 23:25:34)

Re: C, функція fopen для відкриття файлів у циклі

#include <cstdio>
#include <cstring>

int main()
{
    char* fileNames[150] = {0};
    char bufMain[500]={0};
    FILE* fp = fopen("fileslist", "r");
    for (int iFile = 0; iFile < 150 && !feof(fp); iFile++)
    {
      fileNames[iFile] = new char[500];
      for(int i=0;i<500;fileNames[iFile][i++]=0);
      //fgets(fileNames[iFile], 500, fp);
      fscanf(fp, "%s\n", fileNames[iFile]);
      FILE* fscp = fopen(fileNames[iFile], "r");
      fclose (fscp);
    }
    fclose(fp);

    //and don't forget to clear memory reserved by fileNames.
    
return 0;
}

Причина ховалася у символі \n, присутньому у кожному рядку, який повертався з fgets().

I belong to the Dead Generation.
Подякували: Charlie, Ярослав2

11

Re: C, функція fopen для відкриття файлів у циклі

Тепер усе функціонує правильно. Дякую!