在C中写入文件时新行?

时间:2016-08-23 09:34:57

标签: c fopen

我目前正在Linux上编写一个程序,以便从/ proc / stat获取当前的CPU使用率并打印到.txt文件中。但是,在写入文件时,我无法打印新行,输出打印到旧文件...

我想在上一行下打印新行,但使用"\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 个答案:

答案 0 :(得分:4)

您似乎需要将新数据附加到现有文件(即不要覆盖),而不是每次都创建空文件。试试这个:

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

第二个参数"a"表示&#34;追加&#34;:

  

打开文件末尾的输出文件。输出操作总是在文件末尾写入数据,并将其扩展。重新定位操作(fseek,fsetpos,rewind)将被忽略。如果文件不存在,则创建该文件。

修改你的函数checker

似乎也很容易
void checker(FILE *fp) {
  if (fp == NULL){
    perror("The following error occurred");
    exit(EXIT_FAILURE);
  }
}

答案 1 :(得分:3)

在for循环中,您正在以写入模式打开CPU_log.txt文件。

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

模式w会将文件截断为零长度或创建文件以供写入。

以追加模式打开文件。这不会覆盖内容。

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

答案 2 :(得分:1)

您需要打开for() - Loop之外的文件,否则,您的文件会被连续覆盖。或者您需要使用“a”而不是“w”打开文件,该文件附加到文件而不是丢弃所有内容。

此外,%Lf应该做什么? (应该是%f!)