2016-08-23 3 views
1

В настоящее время я пишу программу для Linux, чтобы получить текущее использование ЦП из/proc/stat и напечатать в .txt-файле. Однако при написании файла я не могу напечатать новую строку, а вывод печатает поверх старой ...Новая строка при записи в файл в C?

Я хотел бы напечатать новую строку под предыдущей, но используя "\n" или "\r" символов не работает.

Код здесь:

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

void checker(); 

int main(){ 

    long double a[4], b[4], loadavg; 
    FILE *fp; 
    char dump[50]; 

    for(;;){ 
     fp = fopen("/proc/stat","r"); 
     checker(); 
     fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3]); 
     fclose(fp); 
     sleep(1); 

     fp = fopen("/proc/stat","r"); 
     checker(); 
     fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3]); 
     fclose(fp); 

     fp = fopen("CPU_log.txt", "w"); 
     checker(); 
     loadavg = ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2]))/((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3])); 
     fprintf(fp, "Current CPU Usage is: %Lf\r\n", loadavg); 
     fclose(fp); 
    } 
    return 0; 
} 

void checker(){ 
    FILE *fp; 
    if (fp == NULL){ 
    printf("Error opening file!\n"); 
    exit(1); 
    } 
} 
+3

Функция 'checker' выглядит странно, из-за этого:' FILE * fp; if (fp == NULL) {...} '. Вы не проверяете свой 'fp' с' main'. – pzaenger

ответ

4

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

fp = fopen("CPU_log.txt", "a"); 

Второй аргумент "a" означает "присоединять":

Открыть файл для вывода в конце файла. Операции вывода всегда записывают данные в конце файла, расширяя его. Операции перестановки (fseek, fsetpos, rewind) игнорируются. Файл создается, если он не существует.

Кроме того, кажется reasanoble изменить вашу функцию checker:

void checker(FILE *fp) { 
    if (fp == NULL){ 
    perror("The following error occurred"); 
    exit(EXIT_FAILURE); 
    } 
} 
+1

Я бы рекомендовал использовать 'perror', когда' fopen' терпит неудачу. –

+0

И было бы лучше сделать 'perror (faultyfilepath)' .... и 'exit (EXIT_FAILURE)' более читаем, чем 'exit (1)' –

+0

@BasileStarynkevitch Спасибо, 'EXIT_FAILURE', включенным в ответ. Но у нас нет пути в этой функции (для расширения сообщения 'perror'). Мы можем добавить больше аргументов в функцию 'checker' для ее поддержки, но я уверен, что это будет неправильно. Гораздо лучшее решение здесь - реализовать оболочку для 'fopen'. Вы согласны? – Ilya

1

Вам нужно открыть файлы вне для() - Loop, в противном случае, ваш файл будет перезаписан непрерывно. Или вам нужно открыть файл «a» вместо «w», который добавляется к файлу, а не отбрасывает все.

Кроме того, что означает% Lf? (Должно быть% f!)

3

Внутри для цикла, вы открываете файл CPU_log.txt в режиме записи.

fp = fopen("CPU_log.txt", "w"); 

Режима w будет обрежет файл до нулевой длины или создать файл для записи.

Открыть файл в режиме добавления. Это не будет перезаписывать содержимое.

fp = fopen("CPU_log.txt", "a"); 
Смежные вопросы