Есть файл ips.txt, в нем 10к строк вида: Code: 1.1.1.1 1.1.1.2 2.2.2.1 ... Нужно все их считать так, чтобы и потоки не "подрались"(многопоточность планирую допилить после) и чтобы производительность была не плохая, думал заюзать ReadFile(), по аналогии с WriteFile(), но пока не понял до конца как этим читать строки, мб как-то нужно загружать содержимое файла ips.txt в память и кромсать на массив через "\n" и затем работать с массивом. Видится ещё вариант с функциями типа getline(), но, боюсь скажется на скорости, вообще, не уверен, что годно в данном случае юзать подобное. Полученные строки хочу подставлять в сокет, отрабатывать каждая строка в сокете будет всего один раз, затем сразу переход к новой строке. Подскажите, чем и как лучше сделать, может у кого-то найдётся пример подобной реализации, буду благодарен.
C++ ? Так используй ifstream и getline. На скорости чего скажется? Работа с сокетом будет идти дольше чем работа с файлом, тем более никто не мешает каждому потоку забирать по несколько записей из файла. Или сделай поток-диспетчер, который будет читать из файла и помещать адреса в очередь, а потоки будут разбирать из нее. А если файл маленький, то проще все загрузить в память и не заморачиваться...
Похоже каждая строка это что-то вроде команды. ХитрО конечн. но лучше раздавать команды тредам уже после загрузки файла а грузить его одним куском (ну если нужна хорошая скорость, + если можно обойтись без использования объектов синхронизации - лучше обойтись без них. С ними быстрее работать точно не будет (хотя есть, конечно, APC которым можно будить треды после выдачи задания но это немного другое)) Если нет - в основном треде открываем файл и создаем объект синхронизации, мьютекс в простейшем случае. Ну и в каждом треде перед чтением строки - WaitForSingleObject а после - ReleaseMutex. И всего делов. А чем уж ее читать - вам виднее
DartPhoenix, не смеши, это просто айпишники, и судя по созданным темам aladin1 пишет что-то вроде чекера pop-серверов
твой вариант оказался ближе =) попробовал грузить в память и посчитать строки через fstream, открывал F.open, операция с 500к строк заняла 2-3 сек, скорость приемлимая, пытаюсь ещё потестить getline, но не могу разобраться как дать ему буфер моего файла открытого через winapi, без всяких объявлений потоков ifstream и загрузки файла в них, если такое возможно, конечно: Code: int FileSize; int a = 0; char text[1000]={}; string mystring; HANDLE hFile; DWORD WrittenSize; DWORD dwSize = sizeof(text); hFile = CreateFileA("ips.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); FileSize = GetFileSize(hFile, NULL); cout << FileSize << "\n";// размер выводится норм ReadFile(hFile, text, sizeof(text), &WrittenSize, NULL); While(a != 2) { getline(mystring,...); //вот тут пытался засунуть в mystring строку первую и затем вторую c последующим выводом на консоль, но не понял синтаксиса, чтобы взять именно с hFile cout << mystring << "\n"; a++; } Для тестов надо, хочу в итоге понять какой из двух вариантов окажется шустрее при работе с файлом где более 100к строк.
fstream естественно будет вносить некоторый оверхед при работе с файлом. Другой вопрос, зачем эта скорость при 100_000 строк. Какая разница грузится файл 2-3 секунды или 5-6? Если приспичило нативный хендл в fstream прокинуть, то можно что-нибудь такое попробовать http://stackoverflow.com/questions/...efile-but-force-the-handle-into-a-stdofstream
вопрос исчерпан, потестил и то и другое, если кому интересно, вариант с getline оказался медленнее при чтении 1кк строк примерно в 2-3 раза, к тому же с ним сложнее работать новичкам =), всех благодарю
но зачем? памяти сейчас не 640к явно, так что мапить файл целиком в память и дописать небольшой аналог gets который просто поинтер будет двигать, и залочить доступ через крит секцию.