2015-05-08 2 views
2

Я хочу проверить, содержит ли мой текстовый файл данные. Если файл содержит данные, которые я хочу прочитать. Моя проблема в том, что я не знаю правильного условия для записи в выражении if. Подсказка: я попытался использовать функции fseek & ftell, но без какой-либо выгоды. Я хочу знать, почему это условие в выражении if работает неправильно?проверить, является ли файл пустым или нет в c

FILE *fptr; 
    if(ftell(fptr)!=0){ //check if the file is not empty. 
    if (!(fptr = fopen("saving.txt", "r"))){ 
     printf("File could not be opened to retrieve your data from it.\n"); 
    } 
    else{ 
     while (!feof(fptr)){ 
      fscanf(fptr, "%f\n", &p.burst_time); 
      AddProcess(&l,p.burst_time); 
     } 
     fclose(fptr); 
    } 
    } 
+1

http://stackoverflow.com/questions/8236/how-do-you-determine-the- size-of-a-file-in-c –

ответ

5

это does'nt работа, потому что вы должны FOPEN его и FSEEK до конца первого:

FILE *fptr; 
if (!(fptr = fopen("saving.txt", "r"))){ 
    printf("File could not be opened to retrieve your data from it.\n"); 
} 
else { 
    fseek(fptr, 0, SEEK_END); 
    unsigned long len = (unsigned long)ftell(fptr); 
    if (len > 0) { //check if the file is empty or not. 
     rewind(fptr); 
     while (!feof(fptr)){ 
      fscanf(fptr, "%f\n", &p.burst_time); 
      AddProcess(&l,p.burst_time); 
     } 
    } 
    fclose(fptr); 
} 
+0

Он хорошо работает, зная, является ли файл пустым или нет, но он влияет на чтение из файла. Это заставляет fscanf читать что-то вроде мусора. Когда я удаляю эти строки кода, он хорошо читается из файла: fseek (fptr, 0, SEEK_END); unsigned long len = (unsigned long) ftell (fptr); if (len> 0) {// проверить, является ли файл пустым или нет. Пожалуйста, помогите мне. –

+0

, вы можете захотеть вернуться к началу с использованием перемотки назад (fptr); перед его чтением, yup – h3n

+0

К сожалению. Это еще не работает. –

2

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

Используя sys/stat.h и вызывают значение члена st_size, если его 0, ваш файл пуст.

Так в основном,

#include <sys/stat.h> 
char* filename; //I'm assuming this was defined somewhere earlier in your code 
FILE *fptr; 
struct stat fileStat; 
stat(filename, &fileStat) 

if(fileStat.st_size !=0){ //check if the file is not empty. 
    if (!(fptr = fopen("saving.txt", "r"))){ 
     printf("File could not be opened to retrieve your data from it.\n"); 
    } 
    else{ 
     while (!feof(fptr)){ 
      fscanf(fptr, "%f\n", &p.burst_time); 
      AddProcess(&l,p.burst_time); 
     } 
    fclose(fptr); 
} 

}

Надеется, что это помогает.

+0

FILE * fptr; if (! (Fptr = fopen ("save.txt", "r"))) { printf («Файл не может быть открыт для извлечения ваших данных из него. \ N"); } else { fseek (fptr, 0, SEEK_END); unsigned long len = (unsigned long) ftell (fptr); if (len> 0) {// проверить, является ли файл пустым или нет. перемотка назад (fptr); while (! Feof (fptr)) { fscanf (fptr, "% f \ n", & p.burst_time); AddProcess (& l, p.burst_time); } } fclose (fptr); } Это говорит мне, что файл пуст или нет, но он влияет на чтение из файла. Это заставляет fscanf читать что-то вроде мусора. –

1

Вы можете использовать fseek до конца, а затем проверить, возвращается ли ftell0.

bool isEmpty(FILE *file){ 
    long savedOffset = ftell(file); 
    fseek(file, 0, SEEK_END); 

    if (ftell(file) == 0){ 
     return true; 
    } 

    fseek(file, savedOffset, SEEK_SET); 
    return false; 
} 

или вы можете использовать sys/stat.h и вызвать значение элемента st_size STRUCT:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 

int main (int argc, char *argv[]) { 
    if (argc != 2) { 
    return EXIT_FAILURE; 
    } 

    const char *filename = argv[1]; 
    struct stat st; 

    if (stat(filename, &st) != 0) { 
     return EXIT_FAILURE; 
    } 
    fprintf(stdout, "file size: %zd\n", st.st_size); 
    return EXIT_SUCCESS; 
}