我必須爲我的操作系統作業解決以下問題。我做了一些工作,但我還沒有完成。幫助將不勝感激。如何使用多線程讀取文件?
問題
你的任務是創建一個多線程的文檔分析器。您的程序應該能夠使用可變數量的線程來處理提供的文件,並生成一些關於它的統計信息。該 所需的數字是: • 字數 • 字母 數量(通過使用 因而isalpha ()函數中)• 的標點字符(數字(以計數的空格數中)通過使用 ispunct ()函數)找到。 一個例子的運行將涉及4個線程如下所示: $ ./docAnal 4的test.txt 單詞:1245 信件:24313 標點:87 文件應所需threads.You之間應平分不要硬編碼您的 程序參數。他們應該在命令行被解讀爲在上面的示例所示
這是到目前爲止我的代碼
#include <QThread>
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
using namespace std;
//int count=0;
char buff[200];
class MyThread: public QThread
{
private : int space, word, punc = 0,countl=0;
int ID;
public:
MyThread(int i) : ID(i) {}
void run(){ ifstream myfile;
ifstream fin;
fin.open("example.txt");
myfile.open("example.txt");
cout<<"Reading file"<<endl;
//cout<<"words ="<<word;
while(!myfile.eof())
{
myfile>>buff;
word++;
countl=countl+strlen(buff);
}
for (int i=0;i<strlen(buff);i++)
{
if (ispunct(buff[i])) punc++;
}
cout<<"words ="<<word-1<<endl;
cout<<"Letter="<<countl-(4+punc)<<endl;
cout<<"Puncuation ="<<punc<<endl;
}
};
int main()
{
MyThread *counter [1];
for (int i = 0;i<1;i++){
counter[i] = new MyThread(i);
counter[i]->start();
}
for (int i = 0;i<1;i++){
counter[i]->wait();
}
return 0;
}
我可以使用一個線程只得到一個輸出。我不知道如何將它分成幾部分,並讓4個線程連續讀取。請指向正確的方向。
可能打開該文件中的每個線程讀取文件(除以線程數)的不同部分,並計算上有什麼閱讀統計線程。然後結合所有線程的結果。 – drescherjm 2014-11-05 16:52:35
我會使用mmap()映射文件一次,然後啓動線程並使它們從特定位置(文件中的0%,25%,50%和75%)讀取。 – 2014-11-05 16:53:36