UNIX文件读写不写

时间:2016-08-11 17:00:44

标签: c++ c file unix

我正在尝试在文件中找到匹配并通过写入来修改它。但是字段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问题,因为读取测试显示正确的事件。

1 个答案:

答案 0 :(得分:1)

这肯定存在潜在的问题:

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

此外,您应该检查readwritelseek系统调用的返回值,以确保一切按预期进行。

如果您正在为Windows编译,还要添加标记O_BINARY