[英]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.