Чтение и запись файлов - возможно ли последовательно и последовательно вводить / выводить содержимое буфера без вызова функций навигации по файлу? - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу иметь> = 2 потока (но пока давайте просто скажем, что у нас есть 2), которые читают из отдельных файлов, соответствующих каждому потоку, в буфер, а затем поочередно записывают буфер в тот же файл.

Обычно, это можно сделать следующим образом: получить поток A для чтения файла A, запомнить позицию байта в том месте, где он остановился, записать в sameFile.txt, запомнить, где он остановился, и затем получить поток B для чтения. файл B, запомните позицию байта в том месте, где он остановился, затем продолжите с того места, где он остался, запишите в sameFile.txt.

Однако я спрашиваю, возможно ли извлечь выгоду из определенной «наследственной природы» C ++Операции с файловым потоком и надежное выполнение вышеуказанной задачи БЕЗ вызова функций «навигации», таких как seekg, seekp?

У меня возникает эта идея, потому что если я сделаю это

В одном потоке:

while(usr_input != true)
{
    read_file_in_thread(file,buf,BUF_SIZE);
}

Где "read_file_in_thread" выполняется следующим образом: (показана только выдержка для экономии времени, извинения)

read_file_in_thread(ifstream file_to_read, char * buf, int size_of_buf){
    ...
int pos = 0;
while(!file_to_read.eof())
{
    file_to_read >> buf[pos++];
    if(pos>=BUF_SIZE) break;
}
}

И операции записи в файл в almosТочно так же, как (опять же, выдержка, мои извинения)

file_to_write<<buf[pos++];

Если я делаю вышеупомянутое с одним потоком, я заметил, что чтение и запись выполняются последовательно, мне не нужно предоставлять какую-либо информациюотносительно последней позиции любой файловой операции, как будто система запоминает. Я полагаю, что под капотом C ++ намеренно / непреднамеренно заботится о многих вещах, делая почти все с указателями, и они не так часто перезагружаются?

Как я уже говорил, когда это было сделано с одним потоком,Позиционирование файла происходит «автоматически», но никак не надежно, так как в какой-то момент операция чтения началась с самого начала, а затем продолжилась с последней самой дальней позиции, то есть пошла как 0, 1, 2, 3, затем 0, 4, 5, 6 ...

И когда это было сделано двумя потоками, это поведение "автоматического позиционирования" полностью исчезает, так как при чтении идет как 0, 0, 0, 0 для обоих потоков. Мое предположение (и не позволяйте моему предположению вводить вас в заблуждение) состоит в том, что, когда другой поток вроде звонит, что-то сбрасывается?

Итак, в конечном счете, мои 2 вопроса:

1, почему, когда один поток выполняет операцию, происходит такая вещь с "автоматическим позиционированием"?

2,Является ли это «автоматическое позиционирование» осуществимым, надежно, в 2 или более потоках, без использования таких функций, как seekg, seekp для преднамеренного поиска определенных позиций файла? Возможно ли это вообще?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...