Продолжайте программу, только если два файла существуют на C

#c #file #for-loop

#c #файл #для цикла

Вопрос:

 #include <stdio.h>
#include <stdlib.h>

void main()
{
    int i,x;

    FILE *fl1, *fl2;

    x = 0;

    for(i = 0; ; i  )
    {
        fl1 = fopen("file1","r");
        fl2 = fopen("file2","r");
        if(fopen("file1","r") == NULL amp;amp; fopen("file2","r") == NULL)
        {
           x = x   1;
        }
        else break;
    }

    printf("nnDONE!nn");
}
  

У меня есть этот код, я хочу, чтобы он печатался только тогда, когда существуют 2 файла, file1 и file2.
Но, похоже, это не работает. Когда я создаю только file1, программа прерывается, то же самое, если я создаю только file2.

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

1. вы имеете в виду 1. только эти два файла существуют в папке точно ИЛИ 2. оба файла существуют в папке, по крайней мере ?

Ответ №1:

поскольку вы сохраняете возвращаемое значение fopen() в fl1 и fl2, просто сравните, что они не равны НУЛЮ.

 fl1 = fopen("file1","r");
fl2 = fopen("file2","r");

if( fl1 != NULL amp;amp; fl2 != NULL )
{
  printf( "nDONE!" );
}
  

Ответ №2:

Вы выполняете неправильный тест. fopen возвращает NULL, если файл не удалось открыть. Ваш тест должен быть больше похож:

 if(fopen("file1","r") != NULL amp;amp; fopen("file2","r") != NULL)
  

РЕДАКТИРОВАТЬ: также for(i = 0; ; i ) является бесконечным циклом.

Ответ №3:

Вы должны написать

 FILE *fin1 = fopen("file1", "r");
FILE *fin2 = fopen("file2", "r");
if (fin1 != NULL amp;amp; fin2 != NULL)
{
    // Do your work
    fclose(fin1);
    fclose(fin2);
}
else
{
    // some file didn't open. Close the other possible open one and return error
    if (fin1)
        fclose(fin1);
    if (fin2)
        fclose(fin2);
    // give error;
}
  

Обратите внимание на fclose часть. Важно, чтобы вы закрыли файлы, которые вы открыли. Например, если вы позже захотите открыть его снова. В общем, какой бы ресурс вы ни взяли из операционной системы (например, память, файл, сокет и т. Д.), Вы несете ответственность за его возврат.

Ответ №4:

Оператор:

 if(fopen("file1","r") == NULL amp;amp; fopen("file2","r") == NULL)
  

будет иметь значение true только в том случае, если оба файла не существуют, в результате чего остальные три случая (один существует, другой существует или оба существуют) обрабатываются одинаково.

Если вы намерены просто вывести DONE , если оба существуют, вы можете попробовать:

 #include <stdio.h>

int main (void) {
    FILE *fl1, *fl2;

    fl1 = fopen ("file1", "r");
    fl2 = fopen ("file2", "r");

    if (fl1 != NULL amp;amp; fl2 != NULL)
        printf("DONEn");

    if (fl1 != NULL) fclose (fl1);
    if (fl2 != NULL) fclose (fl2);
}
  

Это также избавляет вас от более, скажем так, … красочного … синтаксические конструкции 🙂

Ответ №5:

Если вы просто хотите проверить, существуют ли файлы, а не открывать их, используйте access() , например.

 #include <unistd.h>

if (!access("file1", F_OK) amp;amp; !access("file2", F_OK))
{
    /* Files exist, do something */
}