C++ std::ifstream/文件*是否可以更改大小?

C++ std::ifstream/文件*是否可以更改大小?,c++,c,C++,C,假设我有以下代码(只需打开一个文件,获取其大小,然后一次性读取): 文件是否可能在file.tellg()和file.read()调用之间更改大小(即另一个程序修改文件)?也就是说,如果file.read()成功,是否保证file.gcount()==file\u size 并将其扩展到C*(即,执行fopen(“rb”),fseek(),ftell(),revind(),fread()),如果fread()成功,它是否总是会返回文件大小(如之前由ftell()报告的那样) 我倾向于这是一个实现

假设我有以下代码(只需打开一个文件,获取其大小,然后一次性读取):

文件是否可能在
file.tellg()
file.read()
调用之间更改大小(即另一个程序修改文件)?也就是说,如果
file.read()
成功,是否保证
file.gcount()==file\u size

并将其扩展到C*(即,执行
fopen(“rb”)
fseek()
ftell()
revind()
fread()
),如果
fread()
成功,它是否总是会返回文件大小(如之前由
ftell()
报告的那样)

我倾向于这是一个实现定义,但我很好奇C++标准(或者C标准,作为C++代码标准,是指<代码>文件/代码>相关函数)在这里做了保证还是不保证。


*我在C++中工作,有两种方法来处理文件:<代码> STD::FStuts和<代码>文件*/COD>。C++标准遵照C标准关于<代码>文件*/COD>函数,这就是为什么我在这里明确提出C。

< P>我认为这取决于您打开的文件类型和操作系统的能力。
要使读取的行为不符合预期,文件必须在
ftell
fread
之间收缩。您可以让另一个进程使用
ftruncate
来实现这一点。我也找不到任何东西能说明文件打开后其他进程会发生什么。但我不希望他们一定能够读取以前存在的数据。

以下实验表明,
std::ifstream
/
文件*
在读取时确实可以改变大小:

Writer1.cpp

#include <fstream>

int main() {
    for (;;) {
        std::ofstream file("file.txt", std::ios_base::binary | std::ios_base::trunc);
        file.flush();
        file << "Hello world!\n";
    }
}
#include <iostream>
#include <fstream>

int main() {
    for (;;) {
        std::ifstream file("file.txt", std::ios_base::binary | std::ios_base::ate);
        std::streamsize file_size = file.tellg();

        if (!file || file_size == -1) continue;

        file.seekg(0);
        char* buffer = new char[file_size];
        file.read(buffer, file_size);
        delete [] buffer;

        if (file.gcount() != file_size) {
            std::cout << file.gcount() << " != " << file_size << std::endl;
            break;
        }
    }
}
#include <iostream>
#include <fstream>
#include <cstdio>

int main() {
    for (;;) {
        FILE* file = fopen("file.txt", "wb");
        fflush(file);
        fwrite("Hello world!\n", 1, 13, file);
        fclose(file);
    }
}
#include <iostream>
#include <cstdio>

int main() {
    for (;;) {
        FILE* file = fopen("file.txt", "rb");
        if (!file) continue;

        fseek(file, 0, SEEK_END);
        long file_size = ftell(file);

        if (file_size == -1) {
            fclose(file);
            continue;
        }

        rewind(file);

        char* buffer = new char[file_size];
        size_t nread = fread(buffer, 1, file_size, file);
        fclose(file);
        delete [] buffer;

        if (nread != file_size) {
            std::cout << nread << " != " << file_size << std::endl;
            break;
        }
    }
}
阅读器2.cpp

#include <fstream>

int main() {
    for (;;) {
        std::ofstream file("file.txt", std::ios_base::binary | std::ios_base::trunc);
        file.flush();
        file << "Hello world!\n";
    }
}
#include <iostream>
#include <fstream>

int main() {
    for (;;) {
        std::ifstream file("file.txt", std::ios_base::binary | std::ios_base::ate);
        std::streamsize file_size = file.tellg();

        if (!file || file_size == -1) continue;

        file.seekg(0);
        char* buffer = new char[file_size];
        file.read(buffer, file_size);
        delete [] buffer;

        if (file.gcount() != file_size) {
            std::cout << file.gcount() << " != " << file_size << std::endl;
            break;
        }
    }
}
#include <iostream>
#include <fstream>
#include <cstdio>

int main() {
    for (;;) {
        FILE* file = fopen("file.txt", "wb");
        fflush(file);
        fwrite("Hello world!\n", 1, 13, file);
        fclose(file);
    }
}
#include <iostream>
#include <cstdio>

int main() {
    for (;;) {
        FILE* file = fopen("file.txt", "rb");
        if (!file) continue;

        fseek(file, 0, SEEK_END);
        long file_size = ftell(file);

        if (file_size == -1) {
            fclose(file);
            continue;
        }

        rewind(file);

        char* buffer = new char[file_size];
        size_t nread = fread(buffer, 1, file_size, file);
        fclose(file);
        delete [] buffer;

        if (nread != file_size) {
            std::cout << nread << " != " << file_size << std::endl;
            break;
        }
    }
}
#包括
#包括
int main(){
对于(;;){
FILE*FILE=fopen(“FILE.txt”、“rb”);
如果(!file)继续;
fseek(文件,0,SEEK_END);
长文件大小=ftell(文件);
如果(文件大小==-1){
fclose(文件);
继续;
}
倒带(文件);
char*buffer=新字符[文件大小];
size\u t nread=fread(缓冲区,1,文件大小,文件);
fclose(文件);
删除[]缓冲区;
如果(nread!=文件大小){

STD::CUT,因为这是C++代码,建议删除Ctag@user3629249C++的标准遵照C标准关于<代码>文件*/COD>操作。因为我有两种方法来处理C++中的文件(<代码> STD::FSturt和<代码>文件*/COD>)我想了解他们的保证,我必须问C++和C.两方面的内容。