在 C 中写入文件时换行?
New line while writing to file in C?
我目前正在 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);
}
}
您似乎需要将新数据附加到现有文件(即不要覆盖),而不是每次都创建空文件。试试这个:
fp = fopen("CPU_log.txt", "a");
第二个参数"a"
表示"append":
Open file for output at the end of a file. Output operations always write data at the end of the file, expanding it. Repositioning operations (fseek, fsetpos, rewind) are ignored. The file is created if it does not exist.
修改你的函数似乎也是合理的checker
:
void checker(FILE *fp) {
if (fp == NULL){
perror("The following error occurred");
exit(EXIT_FAILURE);
}
}
您需要在for()-循环之外打开文件,否则,您的文件会不断被覆盖。或者您需要使用 "a" 而不是 "w" 打开您的文件,它会附加到文件而不是丢弃所有内容。
此外,%Lf 应该做什么? (应该是 %f!)
for 循环内部,您正在以写入模式打开 CPU_log.txt
文件。
fp = fopen("CPU_log.txt", "w");
模式w
会将文件截断为零长度或创建文件进行写入。
以附加模式打开文件。这不会覆盖内容。
fp = fopen("CPU_log.txt", "a");
我目前正在 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);
}
}
您似乎需要将新数据附加到现有文件(即不要覆盖),而不是每次都创建空文件。试试这个:
fp = fopen("CPU_log.txt", "a");
第二个参数"a"
表示"append":
Open file for output at the end of a file. Output operations always write data at the end of the file, expanding it. Repositioning operations (fseek, fsetpos, rewind) are ignored. The file is created if it does not exist.
修改你的函数似乎也是合理的checker
:
void checker(FILE *fp) {
if (fp == NULL){
perror("The following error occurred");
exit(EXIT_FAILURE);
}
}
您需要在for()-循环之外打开文件,否则,您的文件会不断被覆盖。或者您需要使用 "a" 而不是 "w" 打开您的文件,它会附加到文件而不是丢弃所有内容。
此外,%Lf 应该做什么? (应该是 %f!)
for 循环内部,您正在以写入模式打开 CPU_log.txt
文件。
fp = fopen("CPU_log.txt", "w");
模式w
会将文件截断为零长度或创建文件进行写入。
以附加模式打开文件。这不会覆盖内容。
fp = fopen("CPU_log.txt", "a");