2016-03-09 3 views
1

Я немного озадачен тем, как управлять файловым потоком с помощью fstream. Я закажу мои основные вопросы, приведенные ниже:Вопросы управления Fstream

1) Прежде всего, почему вызов конструкторов fstream file(file_name); или fstream file; file.open(file_name); без флага, как ios::in или ios::out не создает какой-либо новый файл?

2) Предположим, я хочу использовать тот же файл для ввода и вывода. Я могу сделать что-то вроде fstream file, а затем позвонить file.open(file_name, ios::out) или file.open(file_name, ios::in), когда мне нужно использовать его для вывода или операции ввода отдельно. Но что, если мне нужно делать ввод и вывод одновременно? Например, мне нужно прочитать из файла и заменить строку или символ всякий раз, когда я нахожу определенное слово или номер во время чтения. Является ли вызов file.open(file_name) для уже созданного файла (и без указания какого-либо флага)? Позволяет ли я выполнять операцию чтения/записи с тем же потоком?

+1

Если файл слишком большой, откройте файл для чтения, прочитайте все в файле в памяти, закройте файл, обновите данные, откройте файл для записи, запишите данные, закройте файл. Чтение и запись в файл одновременно сопряжено с проблемами, которые лучше всего можно избежать, если сможете. –

+0

@luigi вы можете открыть/создать файл с использованием обоих режимов; fs.open («Test.txt», std :: ios :: in | ios :: out); –

+0

@RSahu, к сожалению, я использую файл с единственной целью - не использовать память. Я бы с удовольствием избегал этого, но я вроде как вынужден – luigi

ответ

1

Вот мои ответы:

1) Прежде всего, почему вызов конструкторов fstream файл (имя_файла); или файл fstream; file.open (имя_файла); без какого-либо флага, такого как ios :: in или ios :: out, не создается какой-либо новый файл?

Нет необходимости создавать файл до тех пор, пока не произойдет операция записи. Это отсроченная обработка.

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

Прочитайте режим по умолчанию для этих случаев.

2) Предположим, я хочу использовать тот же файл для ввода и вывода. Я могу сделать что-то вроде файла fstream, а затем вызвать file.open (имя_файла, ios :: out) или file.open (имя_файла, ios :: in), когда мне нужно использовать его для вывода или операции ввода отдельно. Но что, если мне нужно делать ввод и вывод одновременно?

Если вам необходимо выполнить чтение и запись в тот же файл, откройте его с обеими ios::in и ios::out режимами: ios::out | ios::in. Это информирует поток, который вы хотите написать и прочитать, используя тот же поток (файл). Это было разрешено, по крайней мере, с тех пор, как был изобретен язык C.

Кстати, вы должны уточнить «в то же время». В большинстве случаев все происходит последовательно на компьютере, за исключением случаев, когда задействованы несколько процессоров (ядер). Большинство файлов являются последовательными, что означает, что только один источник может читать или записывать в файл. Хотя было несколько исключений.

Многие файлы рассматривались как массивы. Вы можете читать и писать один и тот же раздел много раз. Это называется случайным доступом по сравнению с устройствами, которые являются sequential access.

+0

«в то же время» isn Извините. Я хочу сказать, что мне нужно что-то написать (на самом деле, я должен обновить уже написанное значение) сразу после того, как нашел определенный символ во время чтения. – luigi

1

Это очень выполнимо с помощью ifstream и ofstream:

#include <fstream> 
using namespace std; 

int main() { 
    ifstream source("source-file.txt"); 
    ofstream destination("source-file.txt"); 
    int x; // 0                             
    int y = 1; 
    source >> x; // Reads one int from source-file.txt                    
    source.close(); // Always close file when finished                    
    destination << y; // Write to source-file.txt                     
    return 0; 
} // destination.close() called by destructor 

Думайте поток, как соломинка. Вы не можете пить и втыкать в соломинку одновременно. Сделайте глоток, остановитесь, выдохните, повторите.

+0

Спасибо за ответ, это более безопасный способ сделать это, как многие из них предложили, но мне нужно читать и записывать последовательно из одного и того же объекта потока – luigi