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.两方面的内容。