Linux文件读写之得到重复的内容
在Linux系统中,我们经常需要对问文件进行操作,文件的读写时又经常会出现各种各样的问题。在这里我就讲一下我在进行文件读写操作时遇到的问题。
背景:首先向文件中写入内容,然后从文件中从后往前读取文件中的内容;
在Qt环境下的编程
代码如下:
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include<stdio.h>
#include<string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FILENAME "alamDetailList" //文件名
#define ARRAYSIZE 200
typedef struct alarmMessage{
int msgSize; //数据大小
char mesInfo[ARRAYSIZE]; //数据内容
}msg_t;
void mainWidget::saveMessageToFile() //把内容写入文件中
{
int isFileExist = access(FILENAME,F_OK); //判断文件是否存在
int fd;
if (isFileExist == 0) //文件存在
{
fd = open(FILENAME,O_WRONLY);
qDebug() <<"打开文件";
}else {
qDebug()<<"创建并打开文件";
fd = open(FILENAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
}
if(fd == -1)
{
qDebug() << tr("打开文件失败");
}
lseek(fd,0,SEEK_END); //每次写入文件之前,都移到文件的最后的位置
//alarmMSGDeatil 是QString类型,也就是要写入文件中的内容,下面是将QString类型转换为char *类型
const char *detailTime = alarmMSGDeatil.toStdString().c_str();
msg_t msg;
memset(msg.mesInfo,‘\0‘,sizeof(msg.mesInfo));
msg.msgSize = strlen(detailTime);
strcpy(msg.mesInfo,detailTime);
int bytesWrite = write(fd,&msg,sizeof(msg));
qDebug() << "==bytesWrite111=="<<bytesWrite;
::close(fd);
}
//读取文件内容,从后往前读
void mainWidget::readFile()
{
qDebug("11111111111");
//ui->listWidget->setVisible(true);
int fd = open(FILENAME,O_RDONLY);
if(fd == -1)
{
qDebug() << "打开文件失败";
return;
}
lseek(fd, 0 ,SEEK_END); //位置指向文件的最后
off_t offset = 0;
int readBytes = 0;
//ui->listWidget->clear();
while(1) //通过死循环来完成文件中所有内容的读写
{
offset += sizeof(msg_t);
qDebug() << "===offset=====" <<offset;
//得到当前位置距离文件头的距离
off_t curFromHead = lseek(fd, 0 - offset,SEEK_END);
if(curFromHead < 0) //如果不加上这一判断的话,就会出现文件中内容重复读取 的情况
{
break;
}
//qDebug() <<"====curFromHead====" <<curFromHead;
msg_t readBuf;
readBytes = read(fd, &readBuf, sizeof(msg_t));
qDebug() <<"===readBytes===" << readBytes;
if(readBytes <= 0) //
{
qDebug() << "文件读取完成";
break;
}
QString timeString = QString(readBuf.mesInfo);
qDebug() << timeString;
// ui->listWidget->addItem(timeString);
readBytes = 0;
}
::close(fd);
qDebug()<<"222222";
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。