逐行写入文本文件 c

Write into text file line by line c

我编写了一个用户 space 程序来逐行读取内核设备,不知何故,数据总是在每次读取时被覆盖。你能告诉我如何修复我的代码吗?

代码如下:

#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);
}

我希望输出文件“log.txt”包含写入缓冲区的所有行,每个读取行在行与行之间跳过行。请告诉我正确的方法,包括我上面写的 fprintf 尝试。

谢谢。

char buffer[BUFFER_LENGTH];
while()
{...read(fd, buffer + bytesRead, sizeof(buffer) - bytesRead);}

这一行是个大问题。基本上这会尝试将整个文件存储到 buffer。但是 buffer 的大小很小(256 字节)。

如果文件太大,read 将在第一遍中将 256 存储到 buffer 中。在循环的第二遍中,read 将尝试向同一缓冲区添加另外 256 个字节。

相反,您必须读取小块并在循环内写回。

fPtr = fopen("log.txt", "w+");

这将以read/write 模式打开日志文件,但您只需写入即可。由于这是一个日志文件,请考虑使用 "a" 选项附加到日志文件。

fprintf(fout, "%s", buffer);

当您读取缓冲区时,它可能不是空终止的。请尝试使用 fwrite,或确保 buffer 在使用 fprintf

之前以 null 终止
#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", "w"); //or "a" 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;
}

注意,lseek(fPtr,0,SEEK_SET)是错误的,没有必要。此方法不包括从 open 获得的文件描述符。但是 fPtr 是从 fopen.

获得的 FILE* 句柄

如果可能,请考虑对输入和输出使用标准 c 函数 FILE*/fopen。这样您就可以使用同一组函数 fopenfreadfwritefclosefseekftell。为此你只需要一个头文件:

#include <stdio.h>

int main()
{
    FILE* fin = fopen("/dev/show_log_device_dev", "r");
    if (!fin)
    { perror("input error"); return 0; }

    FILE* fout = fopen("log.txt", "w"); //or "a" to append to log
    if (!fout) 
    {fclose(fin); perror("output error, log.txt is busy!"); return 0; }

    while (1)
    {
        char buffer[256];
        int ret = fread(buffer, 1, sizeof(buffer), fin);
        if (ret == 0)
            break;
        fwrite(buffer, 1, ret, fout);
    }

    fclose(fout);
    fclose(fin);
    return 0;
}