[英]Write into text file line by line c
我编写了一个用户空间程序来逐行读取 kernel 设备,不知何故,每次读取总是会覆盖数据。 你能告诉我如何修复我的代码吗?
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/mman.h>
#define BUFFER_LENGTH 256
int main()
{
int ret,fd;
char buffer[BUFFER_LENGTH];
FILE * fPtr;
unsigned int i=0;
if((fd = open("/dev/show_log_device_dev", O_RDWR)) == -1){
perror("Failed to open the file");
}
//printf("/dev/show_log_device_dev opened.\n");
//fflush(stdout);
fPtr = fopen("log.txt", "w+");
int bytesRead = 0;
while (bytesRead < sizeof(buffer)) {
int ret = read(fd, buffer + bytesRead, sizeof(buffer) - bytesRead);
if (ret == 0)
break;
if (ret == -1) {
perror("Failed to read the message from the device.");
return errno;
/* Handle error */
}
bytesRead += ret;
printf("read from /dev/show_log_device_dev. %s\n",buffer);
}
if(lseek(fPtr,0,SEEK_SET)!=0) {
fprintf(fPtr,"%s",buffer);
}
fclose(fPtr);
}
我希望 output 文件“log.txt”包含写入缓冲区的所有行,每个读取行在行之间跳过行。 请告诉我正确的方法,而不是我上面写的 fprintf 尝试。
谢谢你。
char buffer[BUFFER_LENGTH];
while()
{...read(fd, buffer + bytesRead, sizeof(buffer) - bytesRead);}
这条线是个大问题。 基本上,您正在尝试将整个文件存储到buffer
中。 但是buffer
的大小很小。 相反,您必须读取小块并在循环内写回。
fPtr = fopen("log.txt", "w+");
这将以读/写模式打开日志文件,但您只需要写入它。 由于这是一个日志文件,请考虑对日志文件使用 append 的"a"
选项。
fprintf(fout, "%s", buffer);
当您读取缓冲区时,它可能不会被 null 终止。 请尝试使用fwrite
,或确保buffer
在使用fprintf
之前已终止 null
如评论中所述,使用lseek
是错误的,并且没有必要。
#define BUFFER_LENGTH 256
int main()
{
int fd = open("/dev/show_log_device_dev", O_RDONLY);
if(fd == -1)
{ perror("open failed"); return 0; }
FILE* fout = fopen("log.txt", "a"); //or "w" to create new file
if(fout == NULL)
{ close(fd); perror("fopen failed, log.txt is busy!"); return 0; }
while (1)
{
char buffer[BUFFER_LENGTH];
int ret = read(fd, buffer, sizeof(buffer));
if (ret == 0)
break;
if (ret == -1)
{
perror("Failed to read the message from the device.");
return errno;
}
fwrite(buffer, 1, ret, fout);
//fprintf(fout, "%s", buffer);
}
fclose(fout);
close(fd);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.