- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在处理一个类(class)项目,但在让我的线程完全读取一个文件时遇到了麻烦。我可以让他们说完一两个字,然后他们停下来,不输出任何东西。在我的 main
中,加入线程后,file.eof()
返回 true。有没有人对为什么会发生这种情况或如何解决它有任何建议?
(该项目是使用交替线程从文件中的短语中“排序”元音和辅音;我不能使用互斥锁,这就是为什么有一个转弯变量)
void cons(){
cout << "Turn is " << turn << endl; //outputs "Turn is 0"
while (!file.eof()){
if (turn == false){
char c = word.at(0);
if (c != 'A' || c != 'E' || c != 'I'|| c != 'O'|| c != 'U'){
cout << "Consonant Thread: " << word << '\n';
file >> word;
}
turn = true;
}
this_thread::yield();
}
}
void vowel(){
while (!file.eof()){
if (turn == true){
char c = word.at(0);
if (c == 'A' || c == 'E' || c == 'I'|| c == 'O'|| c == 'U'){
cout << "Vowel Thread: " << word << '\n';
file >> word;
}
turn = false; //keeps track of thread turn to make sure the correct one is running
}
this_thread::yield();
}
}
上面是我的一个函数的例子,另一个类似,但是用c == 'Vowel"
我的主图是这样的
ifstream file;
string word;
bool turn = true; //true for vowel, false for cons
bool done = false;
int main(int argc, char *argv[]) {
{
file.open("phrase.txt");
file >> word;
if (file.eof()){
done = true;
}
std::thread vowelThread(vowel); //passing vow function
std::thread consThread(cons); //passing cons function
cout << file.eof() << endl; //returns true
file.close();
vowelThread.join();
consThread.join();
cout << (file.eof()) << endl; //returns true
}
为了帮助澄清问题,下面是代码应该做什么的示例。在 .txt 文件 “phrase.txt”
中,有一个简单的短语,如 “Operating Systems Class Starts In The Evening”
输出应该是 Vowel Thread: Operating
Consonant Thread: Systems
Consonant Thread: Class
等等,直到文件被读完
任何帮助,包括有关线程的资源或帮助我的代码的建议,我们将不胜感激。提前致谢!
最佳答案
您代码中的主要问题是 main
线程关闭文件,而其他两个线程处理该文件,eof
位被设置也就不足为奇了(线程不能再访问关闭的文件
)。纠正这个问题的正确方法是在您的线程返回后关闭文件
(即在每个线程从join()
返回后)但是您的程序仍然留下主要缺陷是您如何设计 cons
函数和您的逻辑 ||
使用,出于显而易见的原因,我已将其替换为 &&
。
int main(int argc, char *argv[]) {
{
file.open("phrase.txt");
file >> word;
if (file.eof()){
done = true;
}
std::thread vowelThread(vowel); //passing vow function
std::thread consThread(cons); //passing cons function
cout << file.eof() << endl; //returns true
//file.close(); <- closes file while your threads work on it, thus the eof bit is set
vowelThread.join();
consThread.join();
file.close();
cout << (file.eof()) << endl; //returns true
}
和缺点
void cons() {
cout << "Turn is " << turn << endl; //outputs "Turn is 0"
while (!file.eof()) {
if (turn == false) {
char c = word.at(0);
if (c != 'A' && c != 'E' && c != 'I' && c != 'O' && c != 'U') {
cout << "Consonant Thread: " << word << '\n';
file >> word;
}
turn = true;
}
//this_thread::yield();
}
}
附带说明一下,既然您已经看到了 cons
中的错误,您可能会理解为什么我坚持要您提供每个函数,而不是要求我们从一个函数推导出另一个函数。
还有最后一个问题(请注意,您的代码中有几个缺陷,为了保持主题我没有解决):最后一个词 Evening
没有输出,因为当 cons
打印 The
然后将 Evening
加载到 word
并且设置 eof
位,这意味着vowel
线程无法输入您的元音输出代码。这是一个设计流程,我相信您会知道如何处理。
如果您需要进一步的精确度,请注意不要对我的回答发表评论。
关于c++ - 在线程函数c++中读取文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42514101/
我有一个 PowerBI Online 数据集,它是在 PowerBI 桌面中创建然后在线发布的。到目前为止,一切都很好。 我通过 PowerBI pusblish 从 Excel 连接到数据集,按预
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我必须对一些太大而无法放入内存的数据训练分类模型,我正在使用 scikit learn 和 pandas 来进行分析。所以这是我的问题,如何在在线学习管道中使用验证来调整超参数? 我使用带有chuck
我正在开发一个应用程序,该应用程序将从 webservice 获取数据和图像并将其存储在设备中以供离线使用。同时,应用程序会将一些数据存储在 sqlite db 中,并将一些图像作为默认数据。 这是应
是否可以使用 FileReader API 和 onprogress 事件访问随 HTML5 传入的数据? 如果是这样,是否有 MD5 或其他快速散列算法的“在线”版本,以便我可以在文件完全读取之前开
希望任何人都可以帮助我更改下面的代码,我的临时文件包含以下代码: Temp=8.4* Humidity=70.4% 代替代码 Temp = 24 *C, Hum = 40 % 适用于以下脚本。 我需
我必须创建一个功能类似于联系人应用程序的应用程序。您可以在客户的 iPhone 上添加一个联系人,它应该会上传到客户的 iPad 上。如果客户在他们的 iPad 上更新联系人,它应该会在他们的 iPh
在 gitlab.com 上审查 merge 请求时,有时我必须在完成 merge 之前进行 rebase。 在 gitlab 上按“Rebase”后,我有一个特定的管道步骤失败,因为它无法验证用户的
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我正在尝试在 azure 上托管 SQL 服务器以与节点应用程序进行通信。我已经成功地完成了创建数据库服务器和数据库本身的过程。现在,我想编辑我的数据库结构。据我发现online ,应该有一种方法可以
我在 Quickbooks Intuit 开发人员 API 中使用 Oauth 2 获得了访问 token 。 范围是 com.intuit.quickbooks.accounting 我能够使用 Q
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否可以使Angular Material progress spinner与文本并大致与字符的大小一致地显示? 我想要类似的东西: please wait 微调器仅与“请稍候”文本成行出现。 这可
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个每天运行的Powershell脚本。今天它失败了,因为我正在使用的域 Controller 不可用。在继续执行脚本的其余部分之前,我想确保可以连接到可用的DC。 $LdapServer = "
我想制作一款在线 Flash 游戏,它将具有社交功能,但游戏玩法将主要是单人游戏。例如,屏幕上不会同时出现两个玩家,社交互动将通过异步消息进行,不会有实时聊天或其他任何内容。大部分逻辑将发生在客户端中
这几天我开始在线玩OpenShift。我部署了一个非常简单的“Hello World”Java 示例(1 行代码!),没有任何依赖项(没有 Spring!)命令行是这样的: oc.exe new-a
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
所以我一直在网上学习Java(初学者),并且我一直在尝试制作一个用于制作矩形的类文件。但是,我的在线 java 评估器指出它找不到实例变量。 This is the comment on it.我的代
我是一名优秀的程序员,十分优秀!