while(cina)在文件输入时,切换时会出现的问题
1.
首先cin>>a返回的是左操作數(shù),也就是返回cin。
cin的條件狀態(tài)中: cin.eof()??? 判斷流是否到達(dá)文件的結(jié)束符
cin.fail()??? 判斷IO操作是否失敗
在while(cin>>a)中看流是否還能用,主要是判斷 cin.fail()??的取值。事實(shí)上,無論是否用于while循環(huán),流必須處于無錯(cuò)誤狀態(tài)才能用于輸入和輸出?,也就是cin.fail()?必須為0值,程序以下的cin操作才能正常執(zhí)行。
導(dǎo)致cin.fail()?為1的操作有:輸入壞值 或 遇到文件結(jié)束符(ctrl+z)
當(dāng)cin.fail()?=1時(shí),可以設(shè)置cin.clear()將流中的所有狀態(tài)值設(shè)為有效狀態(tài),以下操作就會(huì)正常輸入輸出了,否則再遇到cin就不能正常讀入賦值。
2.
關(guān)于while(cin>>a)中輸入值是用 “空格” 間隔還是用 “回車” 間隔的問題:
while(cin)中有個(gè)緩沖機(jī)制規(guī)定,只有收到回車鍵,才會(huì)將所有輸入的數(shù)據(jù)一次提交到輸入處理函數(shù)cin里,而這個(gè)輸入過程,在按下回車之前,是不受cin控制的。
對(duì)于正常的輸入,用回車和空格沒有差別,關(guān)鍵是我們最后往往要輸入個(gè)ctrl+z來結(jié)束輸入,這里要特別注意,ctrl+z之前必須要按“回車”,不能是空格,也不能什么都不按。
正確的順序是:“正常值輸入(以空格或回車間隔都可以)”、“回車”、(ctrl+z)、“回車”。這樣在緩沖機(jī)制下while(cin)循環(huán)就會(huì)把ctrl+z作為輸入流單獨(dú)進(jìn)行判斷,cin.eof()為真,即遇到正常的文件結(jié)束符,否則,while(cin)循環(huán)判斷時(shí)以為ctrl+z和之前的空格是一起的或者和之前的其他輸入是一起的,認(rèn)為是輸入了壞值,認(rèn)為沒有遇到正常的文件結(jié)束符。
?
這樣理解對(duì)嗎,歡迎批評(píng)指正!
PS:在寫算法作業(yè)時(shí),需要先從文件讀入待查詢文本,之后還要從不同文件中讀入查詢。在切換文件時(shí)出現(xiàn)問題,用while(cin>>a)判斷文件結(jié)束后就是切換不了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
string str;
string tmp;
int next[maxn],dp[maxn];
void getnext()
{memset(next,0,sizeof(next));int l=tmp.length();int i=0,j=-1;next[0]=-1;while(i<l-1){if(j==-1||tmp[j]==tmp[i]){++i;++j;next[i]=j;}else{j=next[j];}}
}
int kmp()
{int i=0,j=0;int l1=str.length();int l2=tmp.length();int cnt=1;while(i<l1&&j<l2){if(j==-1||str[i]==tmp[j]){i++;j++;}else{j=next[j];}if(j==l2-1)return dp[i-j+1];}return -1;
}
int main()
{freopen("corpus.txt","r",stdin);while(cin>>tmp){str=str+" "+tmp;}/*for(int i=0;i<60;i++)//(用這句話代替上一句話,執(zhí)行起來是沒有問題的 ,但問題是我事先不知道文件里面有多少個(gè)字符串) {cin>>tmp;str=str+tmp;} */cout<<str<<endl;fclose(stdin);// cin.clear(); 一開始不加這句話,執(zhí)行到while(getline(cin,tmp)就會(huì)停止無法再?gòu)目刂婆_(tái)輸入。 int l=str.length();dp[0]=1;for(int i=1;i<l;i++){if(str[i]==' ')dp[i]=dp[i-1]+1;else dp[i]=dp[i-1];}freopen("CON","r",stdin);while(getline(cin,tmp)){tmp=tmp+" ";getnext();int t=kmp();if(t==-1){cout<<"--"<<tmp<<endl;}else cout<<t<<' '<<tmp<<endl;}}
總結(jié)
以上是生活随笔為你收集整理的while(cina)在文件输入时,切换时会出现的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟频率和数字频率的区别
- 下一篇: 信号量,互斥锁,条件变量的联系与区别