我已經撰寫了一個用戶空間程式來逐行讀取內核設備,不知何故,每次讀取時資料總是被覆寫。你能告訴我如何修復我的代碼嗎?
這是代碼:
#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 嘗試。
謝謝你。
uj5u.com熱心網友回復:
char buffer[BUFFER_LENGTH];
while()
{...read(fd, buffer bytesRead, sizeof(buffer) - bytesRead);}
這條線是個大問題。基本上這會嘗試將整個檔案存盤到buffer. 但buffer體積小(256 位元組)。
如果檔案太大,read將buffer在第一遍中存盤 256 個。在回圈的第二遍中,read將嘗試向同一個緩沖區添加另外 256 個位元組。
相反,您必須讀取小塊并在回圈內寫回。
fPtr = fopen("log.txt", "w ");
這將以讀/寫模式打開日志檔案,但您只需要寫入它。由于這是一個日志檔案,請考慮使用"a"選項附加到日志檔案。
fprintf(fout, "%s", buffer);
當您讀取緩沖區時,它可能不會以空值終止。嘗試fwrite改用,或確保buffer在使用前以 null 終止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是FILE*從fopen.
如果可能,請考慮FILE*/fopen對輸入和輸出使用標準的 c 函式。通過這種方式,您將能夠使用相同的函式集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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360985.html
