Создает ли iostream (c ++) данные с жесткого диска в память? - PullRequest
2 голосов
/ 25 апреля 2011

Когда я создаю iostream при открытии файла, он всегда будет считывать весь файл с жесткого диска и затем помещать его в память, или он поступает в буфер и буферизируется ОС по требованию?

Я спрашиваю, потому что один из способов проверить, существует ли файл, состоит в том, чтобы увидеть, не открывается ли он, но я боюсь, что открываемые файлы очень большие, тогда это займет много времени, если iostream должен прочитать весь файл при открытии.

Ответы [ 4 ]

3 голосов
/ 25 апреля 2011

Проверить, существует ли файл, можно следующим образом, если вы хотите использовать boost .

#include <boost/filesystem.hpp>

bool fileExists = boost::filesystem::exists("foo.txt");
2 голосов
/ 25 апреля 2011

Открытие файла - плохой способ проверить, существует ли файл - все, что он делает, это говорит вам, можете ли вы открыть его.Открытие может завершиться неудачей по ряду причин, как правило, потому что у вас нет разрешения на чтение, но файл все равно будет существовать.Обычно лучше использовать специальную функцию операционной системы для проверки существования.И нет, открытие fstream не приведет к чтению содержимого.

2 голосов
/ 25 апреля 2011

Нет, он не будет считывать весь файл в память при его открытии. Он будет читать ваш файл порциями, но я считаю, что этот процесс не запустится, пока вы не прочитаете первый байт. Кроме того, эти куски являются относительно небольшими (порядка 4-128 кибибайт), и тот факт, что это происходит, значительно ускоряет процесс чтения файла.

В тесте на моем компьютере с Linux (ну, на Linux VM) простое открытие файла приводит только к системному вызову ОС open, но не к системному вызову read. Он не начинает читать что-либо из файла до первой попытки чтения из потока. И затем он читает 8191 (почему 8191? Это кажется очень странным числом) куски байтов, когда я читаю файл в.

0 голосов
/ 25 апреля 2011

Я думаю, что при открытии файла заполняются соответствующие структуры данных для процесса, открывающего файл, которые включают указатель файла, дескриптор файла, v-узел и т. Д.

Теперь можно читать и записывать в файл, используя буферизованные потоки (fwrite, fread) или используя системные вызовы (чтение и запись).

Когда мы используем буферизованные потоки, мы буферизируем данные, а затем записываем или читаем их [Это сделано для целей эффективности]. Само это утверждение означает, что весь файл не считывается в память, но определенные байты считываются в буфер и затем становятся доступными.

В случае вызовов sys, таких как чтение и запись, выполняется буферизация на уровне ядра (с помощью fsync можно также очистить буфер ядра), но данные фактически читаются и записываются в устройство .file

checking existance of file

#include &lt sys/stat.h &gt

int main(){
struct stat file_i;
std::string f("myfile.txt");
if (stat(f.c_str(),&file_i) != 0){
   cout &lt&lt "File not found" &lt&lt endl;
}
return 0;
}

Надеюсь, это прояснит немного.

...