gpt4 book ai didi

c - rewind 和fsetpos 是否也可以干预C 文件追加方式的后续写入?

转载 作者:太空狗 更新时间:2023-10-29 15:06:51 25 4
gpt4 key购买 nike

C11 Working Draft Standard N1570在“7.21.5.3 fopen 函数”部分的第 306 页上说

Opening a file with append mode ('a' as the first character in the mode argument) causes all subsequent writes to the file to be forced to the then current end-of-file, regardless of intervening calls to the fseek function. ...

谁能确认不仅fseek函数而且其他文件定位函数如fsetposrewind都不能干预追加模式?

好吧,第 338 页上的标准说倒带对 (void)fseek(stream, 0L, SEEK_SET) 做了类似的事情,只是流的错误指示器也被清除了。但据我在第 337 页所读,标准并未说明 fsetpos 类似于 fseek。


说明这个问题的源代码

#include <stdio.h>

// Declare the File Pointer
FILE *fp;

// Declare the test integer variable
int TEST;

// declare the test position variable for fsetpos test
fpos_t POSITION;

void WriteData(int choice){
// Clear the file content
fp = fopen("test.bin", "wb"); fclose(fp);

// Reopen the file with ab
fp = fopen("test.bin", "ab");

// Initialize the test integer variable
TEST = 100;

// Write five sample data
int i;
for(i = 1; i <= 5; i++) {

fwrite(&TEST, sizeof(TEST), 1, fp);

// If two data were written then save the position
if( i == 2 )
fgetpos(fp, &POSITION);
}

// Change the data
TEST = 54321;

// Declare the test case
switch(choice){
case 1 : fseek(fp, (long) 2*sizeof(TEST), SEEK_SET); break;
case 2 : rewind(fp); break;
case 3 : fsetpos(fp, &POSITION); break;
}

// Write the data again
fwrite(&TEST, sizeof(TEST), 1, fp);

// Close the file
fclose(fp);
}


void ReadData(){
// Open the file for read
fp = fopen("test.bin", "rb");

printf("\n [OUTPUT]");
// while the data can be read then print it to the console
while( fread(&TEST, sizeof(TEST), 1, fp) == 1)
printf("\n %d", TEST);

// Close the file
fclose(fp);
}

int main(){

/* Test Case Process */
printf("\n\n Intervene using fseek(fp, (long) 2*sizeof(TEST), SEEK_SET);");
WriteData(1);
ReadData();

printf("\n\n Intervene using rewind(fp);");
WriteData(2);
ReadData();

printf("\n\n Intervene using fsetpos(fp, &POSITION);");
WriteData(3);
ReadData();




return 0;
}

期望的输出:

 Intervene using fseek(fp, (long) 2*sizeof(TEST), SEEK_SET);
[OUTPUT]
100
100
100
100
100
54321

Intervene using rewind(fp);
[OUTPUT]
100
100
100
100
100
54321

Intervene using fsetpos(fp, &POSITION);
[OUTPUT]
100
100
100
100
100
54321

如果输出是这样,那么标准确实确认不仅 fseek 函数不能干预后续写入,而且 rewind fsetpos。否则,如果输出不是那样,则标准不会确认。

我已经在 Windows 10 上使用 tdm-gcc 4.9.2 和 Ubuntu 16.04 gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 对其进行了测试。结果是三个都插不进去,但是我在别的平台不知道插不插。

最后,如果我可以再问一遍我的问题。标准是否也确认不仅fseek函数不能干预后续写入,还有rewindfsetpos

如果标准确认那么请说明确认的声明在哪里。

否则,如果标准不确认,那么请解释表明拒绝的声明在哪里。

关于我的问题,我需要知道的是标准确实确认编译器编写者必须准确地做这个或做那个等的确定性以确认标准,仅此而已

最佳答案

对于流 I/O,rewind() 都不是也不fsetpos()覆盖追加模式——超过fseek()做。隐式追加模式发生在写入发生时;定位操作是独立的,只影响隐式查找的起始位置,而不影响写入发生的位置。

带文件描述符 I/O,pwrite() — 定位写入 — 确实会覆盖追加模式,但其他操作不会。 POSIX 声明:pwrite() 函数应等效于 write(),除了它写入给定位置并且不更改文件偏移量(无论O_APPEND 是否设置)。

关于c - rewind 和fsetpos 是否也可以干预C 文件追加方式的后续写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40902789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com