#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 */
}