UNIX文件读取和写入而非写入
UNIX file read and writing over not writing
我试图在文件中找到一个命中项,并通过重写来修改它。但是字段Effectue
(从结构TRAVAIL
(的修改不适用。我检查了我是否替换了右出现(注释部分(,但当我再次调用函数时,我仍然得到第一个Effectue
设置为false
的出现。
TRAVAIL RechercheProchainTravail() {
int i, fp;
TRAVAIL travailRetour;
if ((fp = open("Travaux.dat", O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1) {
perror("Err open Travaux.dat");
exit(1);
}
// init
for (i = 0; TravauxInit[i].IndiceLieu > 0; i++)
write(fp, &TravauxInit[i], sizeof(TRAVAIL));
// remise au debut
lseek(fp, 0, SEEK_SET);
//lecture
for (i = 0; TravauxInit[i].IndiceLieu > 0; i++) {
read(fp, &travailRetour, sizeof(TRAVAIL));
if (travailRetour.Effectue == false) {
travailRetour.Effectue = true;
lseek(fp, -sizeof(TRAVAIL), SEEK_CUR);
/*read(fp, &travailRetour, sizeof(TRAVAIL));
Trace(" indice; %d effect %d", travailRetour.IndiceLieu, travailRetour.Effectue);
lseek(fp, -sizeof(TRAVAIL), SEEK_CUR);*/
write(fp, &travailRetour, sizeof(TRAVAIL));
break;
}
}
close(fp);
return travailRetour;
}
编辑:正如peter注意到的那样,我更改了打开以防止文件被截断,但问题仍然存在,我仍然访问第一次出现的内容,因为写入不会更改Effectue字段值。
这是我的代码编辑:
if (access( "Travaux.dat", F_OK ) != -1) { // si existe ouvrir
if ((fp = open("Travaux.dat", O_RDWR, 0664)) == -1) {
perror("Err open Travaux.dat");
exit(1);
}
} else { // sinon creer
if ((fp = open("Travaux.dat", O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1) {
perror("Err open Travaux.dat");
exit(1);
}
}
这不是lseek
问题,因为读取测试显示正确的出现。
这肯定有一个潜在的问题:
lseek(fp, -sizeof(TRAVAIL), SEEK_CUR);
如果size_t
小于off_t
,则-sizeof(TRAVAIL)
是一个大的无符号值(SIZE_MAX - sizeof(TRAVAIL) + 1
(,它被转换为off_t
,而不是您期望通过一个结构向后查找的负值。
你可以这样修复:
lseek(fp, -(off_t)sizeof(TRAVAIL), SEEK_CUR);
此外,您应该检查read
、write
和lseek
系统调用的返回值,以确保一切按预期进行。
如果您正在为Windows进行编译,请添加标志O_BINARY
。
相关文章:
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量