下面的實驗表明,std::ifstream
/FILE*
的確可以改變大小,而閱讀它:
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";
}
}
Reader1.cpp:
#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;
}
}
}
編譯Writer1.cpp
和Reader1.cpp
並且同時運行它們最終會產生0 != 13
,這表明std::ifstream
確實可以在tellg()
和read()
之間更改大小。
Writer2.cpp:
#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);
}
}
Reader2。CPP:
#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;
}
}
}
同樣,編譯Writer2.cpp
和Reader2.cpp
,並在同一時間運行它們最終產生0 != 13
,顯示出一個FILE*
可的確是一個ftell()
和fread()
之間改變大小。
有趣的是,std::ifstream
的失敗速度比FILE*
的要快。這些測試是在OS X 10.9.5上使用3.5版進行的。
因爲這是C++代碼,建議刪除'c'標籤 – user3629249 2015-04-03 16:24:55
@ user3629249:請參閱腳註。 C++標準遵循關於'FILE *'操作的C標準。由於我有兩種使用C++('std :: fstream'和'FILE *')的方式來處理文件,我想了解它們的保證,所以我不得不問C++和C. – Cornstalks 2015-04-03 16:26:01