逐行写入文本文件 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
。这样您就可以使用同一组函数 fopen
、fread
、fwrite
、fclose
、fseek
、ftell
。为此你只需要一个头文件:
#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;
}
我编写了一个用户 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
#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
。这样您就可以使用同一组函数 fopen
、fread
、fwrite
、fclose
、fseek
、ftell
。为此你只需要一个头文件:
#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;
}