Я хочу иметь> = 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 для преднамеренного поиска определенных позиций файла? Возможно ли это вообще?
Я понимаю, что мой код и мое описание вопроса могут не дать полной картины, но я надеюсь передать общую идею. При решении этого вопроса вы можете свободно добавлять другие функции и переменные и многое другое по своему усмотрению, но это не рекомендуется, рекомендуется работать с тем, что вы дали в вопросе.