Продолжайте программу, только если два файла существуют в C - PullRequest
0 голосов
/ 10 октября 2011
#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 && fopen("file2","r") == NULL)
        {
           x = x + 1;
        }
        else break;
    }

    printf("\n\nDONE!\n\n");
}

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

Ответы [ 5 ]

3 голосов
/ 10 октября 2011

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

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

if( fl1 != NULL && fl2 != NULL )
{
  printf( "\nDONE!" );
}
1 голос
/ 10 октября 2011

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

FILE *fin1 = fopen("file1", "r");
FILE *fin2 = fopen("file2", "r");
if (fin1 != NULL && 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 часть.Важно, чтобы вы закрыли файлы, которые вы открыли.Например, если позже вы захотите открыть его снова.В целом, какой бы ресурс вы ни брали у операционной системы (например, память, файл, сокет и т. Д.), Вы обязаны вернуть его.

1 голос
/ 10 октября 2011

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

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

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

1 голос
/ 10 октября 2011

Оператор:

if(fopen("file1","r") == NULL && fopen("file2","r") == NULL)

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

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

#include <stdio.h>

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

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

    if (fl1 != NULL && fl2 != NULL)
        printf("DONE\n");

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

Это также избавит вас от большего, скажем, ... красочные ... синтаксические конструкции: -)

0 голосов
/ 10 октября 2011

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

#include <unistd.h>

if (!access("file1", F_OK) && !access("file2", F_OK))
{
    /* Files exist, do something */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...