簡體   English   中英

逐行寫入文本文件 c

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM