#17021: C的


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
e080. read and write -- it's david | From: [27.52.9.157] | 發表日期 : 2019-03-01 11:59

關鍵就一個 : 如何在不消耗大量儲存空間下,任意移動 " 讀資料的進入點 "

學過檔案的 IO 的話,應該會記得要先宣告一個 FILE 指標,使用這個指標進行資料流的處理

而在 C 當中,有一個函式可以使指標回到檔案開頭,就是 rewind ()

而這題怎麼使用 rewind () 呢,我的做法如下

先找到 " 空格 ",也就是忽略第一個數字

然後一邊讀字串一邊輸出,把第二個數字先輸出,之後輸出空格

使用 rewind ( stdin ),將指標回到最前面,輸出第一個數字即可

( stdin 就是輸入流,因為無法知道要開啟的測資檔案名,直接使用即可 )

( stdin 是 stdio.h 定義的一個巨集,不需要再另外宣告了 )

 
#17022: Re:C的


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
e080. read and write -- it's david | From: [49.158.83.43] | 發表日期 : 2019-03-01 12:23

關鍵就一個 : 如何在不消耗大量儲存空間下,任意移動 " 讀資料的進入點 "

學過檔案的 IO 的話,應該會記得要先宣告一個 FILE 指標,使用這個指標進行資料流的處理

而在 C 當中,有一個函式可以使指標回到檔案開頭,就是 rewind ()

而這題怎麼使用 rewind () 呢,我的做法如下

先找到 " 空格 ",也就是忽略第一個數字

然後一邊讀字串一邊輸出,把第二個數字先輸出,之後輸出空格

使用 rewind ( stdin ),將指標回到最前面,輸出第一個數字即可

( stdin 就是輸入流,因為無法知道要開啟的測資檔案名,直接使用即可 )

( stdin 是 stdio.h 定義的一個巨集,不需要再另外宣告了 )


原來 C 有 rewind() 可以用,受教了XD

 

本人的作法是自己用 C++ 串流的 streambuf 底下的 pubseekoff()pubseekpos() 以及 sgetn() 函式自己慢慢刻出 AC 的。

很輕小,執行速度也快,可是過程艱辛 (本人幾乎沒在碰串流的處理)。

 

順帶一提, AC 了這題之後,可以試試看挑戰 c631: 記憶力試驗 喔。

 
#17024: Re:C的


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
e080. read and write -- it's david | From: [27.52.9.157] | 發表日期 : 2019-03-01 12:48

 


原來 C 有 rewind() 可以用,受教了XD

 

本人的作法是自己用 C++ 串流的 streambuf 底下的 pubseekoff()pubseekpos() 以及 sgetn() 函式自己慢慢刻出 AC 的。

很輕小,執行速度也快,可是過程艱辛 (本人幾乎沒在碰串流的處理)。

 

順帶一提, AC 了這題之後,可以試試看挑戰 c631: 記憶力試驗 喔。


奇怪的是,我 c631 一直 NA 0%,但是有些輸出卻是對的

顯示錯的地方也完全看不到,估計是字串的尾端有錯

一直找不到問題,有點煩 .......

 
#17025: Re:C的


asnewchien@gmail.com (david)

學校 : 不指定學校
編號 : 68108
來源 : [1.168.27.116]
最後登入時間 :
2024-03-31 17:58:15
e080. read and write -- it's david | From: [61.223.44.184] | 發表日期 : 2019-03-01 12:55

 

c631 那題像夾娃娃機一樣,你要讓夾子能在測資上方盤旋。

 
#17027: Re:C的


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
e080. read and write -- it's david | From: [27.52.9.157] | 發表日期 : 2019-03-01 13:56

 





我找到問題了,應該是輸出格式問題,以及暫存用的緩衝字元陣列沒有清空,至少解開了

 
#17030: Re:C的


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.140.212.72]
最後登入時間 :
2024-01-06 21:35:40
e080. read and write -- it's david | From: [42.72.160.79] | 發表日期 : 2019-03-01 17:43

關鍵就一個 : 如何在不消耗大量儲存空間下,任意移動 " 讀資料的進入點 "

學過檔案的 IO 的話,應該會記得要先宣告一個 FILE 指標,使用這個指標進行資料流的處理

而在 C 當中,有一個函式可以使指標回到檔案開頭,就是 rewind ()

而這題怎麼使用 rewind () 呢,我的做法如下

先找到 " 空格 ",也就是忽略第一個數字

然後一邊讀字串一邊輸出,把第二個數字先輸出,之後輸出空格

使用 rewind ( stdin ),將指標回到最前面,輸出第一個數字即可

( stdin 就是輸入流,因為無法知道要開啟的測資檔案名,直接使用即可 )

( stdin 是 stdio.h 定義的一個巨集,不需要再另外宣告了 )

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

#include<iostream>
#include<cstring>
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include<iostream> #include<cstring> using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

 
#17032: Re:C的


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
e080. read and write -- it's david | From: [49.158.83.43] | 發表日期 : 2019-03-01 19:00

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

 
#17034: Re:C的


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.140.212.72]
最後登入時間 :
2024-01-06 21:35:40
e080. read and write -- it's david | From: [42.72.160.79] | 發表日期 : 2019-03-01 19:23

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

試過了,應該不是
不過還是謝謝您的建議~

 
#17035: Re:C的


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
e080. read and write -- it's david | From: [27.52.9.157] | 發表日期 : 2019-03-01 19:43

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

試過了,應該不是
不過還是謝謝您的建議~


剛剛找了一下資料,C++ 的 rewind () 在 <cstdio> 裡

或許可以試試看加這個標頭檔 ?

 
#17036: Re:C的


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.140.212.72]
最後登入時間 :
2024-01-06 21:35:40
e080. read and write -- it's david | From: [42.72.160.79] | 發表日期 : 2019-03-01 19:47

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

試過了,應該不是
不過還是謝謝您的建議~


剛剛找了一下資料,C++ 的 rewind () 在 裡

或許可以試試看加這個標頭檔 ?

iostream應該有包含cstdio吧?!(我每次用scanf,printf都是用iostream,而且這個程式碼不會CE,只會WA)


 
#17037: Re:C的


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
e080. read and write -- it's david | From: [49.158.83.43] | 發表日期 : 2019-03-01 20:03

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

試過了,應該不是
不過還是謝謝您的建議~

根據剛剛惡補的資料以及本人的理解來看 (因此不一定正確),由於您已經使用 ios:sync_with_stdio(false) 將 cin、cout 跟標準輸出入 (也就是stdio) 解除綁定了。

而 rewind(stdin) 是把標準輸入 (scanf 等等) 的指標指回去資料的開頭,因此不會影響 cin 的指標。

也就造成第一個數字出不來,因為 cin 的輸入串流之指標還停留在資料的尾端。

因此,可能要考慮把解綁關掉,或是採用別的函式去設置 cin 的串流指標。

以上。

 
#17038: Re:C的


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.140.212.72]
最後登入時間 :
2024-01-06 21:35:40
e080. read and write -- it's david | From: [42.72.160.79] | 發表日期 : 2019-03-01 20:28

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

試過了,應該不是
不過還是謝謝您的建議~

根據剛剛惡補的資料以及本人的理解來看 (因此不一定正確),由於您已經使用 ios:sync_with_stdio(false) 將 cin、cout 跟標準輸出入 (也就是stdio) 解除綁定了。

而 rewind(stdin) 是把標準輸入 (scanf 等等) 的指標指回去資料的開頭,因此不會影響 cin 的指標。

也就造成第一個數字出不來,因為 cin 的輸入串流之指標還停留在資料的尾端。

因此,可能要考慮把解綁關掉,或是採用別的函式去設置 cin 的串流指標。

以上。

解綁關掉:測資點#0,#1會TLE,測資點#2則依然WA

我查到能替代的函式是fseek(),可是它也是stdio裡的....
有可以只用stdio,速度也夠快的io函式嗎?

 
#17039: Re:C的


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
e080. read and write -- it's david | From: [49.158.83.43] | 發表日期 : 2019-03-01 20:34

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

試過了,應該不是
不過還是謝謝您的建議~

根據剛剛惡補的資料以及本人的理解來看 (因此不一定正確),由於您已經使用 ios:sync_with_stdio(false) 將 cin、cout 跟標準輸出入 (也就是stdio) 解除綁定了。

而 rewind(stdin) 是把標準輸入 (scanf 等等) 的指標指回去資料的開頭,因此不會影響 cin 的指標。

也就造成第一個數字出不來,因為 cin 的輸入串流之指標還停留在資料的尾端。

因此,可能要考慮把解綁關掉,或是採用別的函式去設置 cin 的串流指標。

以上。

解綁關掉:測資點#0,#1會TLE,測資點#2則依然WA

我查到能替代的函式是fseek(),可是它也是stdio裡的....
有可以只用stdio,速度也夠快的io函式嗎?

兩個解決方式:

一個是把所有的輸出入(cin、cout)改回標準輸入(scanf、printf)。

另一個是用這串的第二個留言,也就是本人在這串的第一個回文,當中提及的函式去操作 cin 的串流指標云云。

 
#17040: Re:C的


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.140.212.72]
最後登入時間 :
2024-01-06 21:35:40
e080. read and write -- it's david | From: [42.72.160.79] | 發表日期 : 2019-03-01 21:13

請問在rewind()後要用什麼讀第一個數字?(目前試過getline(),get(),都讀不到...,看過大大您c631的解題報告,試過fread,但我不太會用)

 

#include
#include
using namespace std;
char s[5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin.ignore(25000001,' ');
while(cin.get(s,5000,EOF)){
	cout<<s;
	memset(s,0,sizeof(s));
}
cout<<' ';
rewind(stdin);
while(cin.getline(s,5000,' ')){//cin.get(s,5000,' ')-->網路上說getline()放到while裡會出現無窮迴圈?!
	cout<<s;
	memset(s,0,sizeof(s));
}
}
/*#include #include using namespace std; char s[5001]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin.ignore(25000001,' '); while(cin.get(s,5000,EOF)){ cout<<s; memset(s,0,sizeof(s)); } cout<<' '; rewind(stdin); fread(s,sizeof(char),5000,stdin); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),5000,stdin)); do{ cout<<s; memset(s,0,sizeof(s)); }while(fread(s,sizeof(char),1,stdin));//先讀到剩5000個以下再1個1個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/

 

不確定是否為以下原因,但是還是打出來供您參考:

第一個迴圈之後,也就是讀完第二個數字之後, cin 會變成壞狀態 (bad state),因為碰到了 EOF的例外情況 (EOF exception)

而 cin 變成壞狀態之後,會無法使用。為此,需要將 cin 變回預設的狀態,也就是好狀態 (good state)

可以試試看用 cin.clear() 重設 cin 的狀態。

以上。

試過了,應該不是
不過還是謝謝您的建議~

根據剛剛惡補的資料以及本人的理解來看 (因此不一定正確),由於您已經使用 ios:sync_with_stdio(false) 將 cin、cout 跟標準輸出入 (也就是stdio) 解除綁定了。

而 rewind(stdin) 是把標準輸入 (scanf 等等) 的指標指回去資料的開頭,因此不會影響 cin 的指標。

也就造成第一個數字出不來,因為 cin 的輸入串流之指標還停留在資料的尾端。

因此,可能要考慮把解綁關掉,或是採用別的函式去設置 cin 的串流指標。

以上。

解綁關掉:測資點#0,#1會TLE,測資點#2則依然WA

我查到能替代的函式是fseek(),可是它也是stdio裡的....
有可以只用stdio,速度也夠快的io函式嗎?

兩個解決方式:

一個是把所有的輸出入(cin、cout)改回標準輸入(scanf、printf)。

另一個是用這串的第二個留言,也就是本人在這串的第一個回文,當中提及的函式去操作 cin 的串流指標云云。

好吧,我去惡補一下streambuf(從來沒用過XD)
謝謝您的幫忙~

 
#20430: Re:C的


asnewchien@gmail.com (david)

學校 : 不指定學校
編號 : 68108
來源 : [1.168.27.116]
最後登入時間 :
2024-03-31 17:58:15
e080. read and write -- it's david | From: [36.232.33.123] | 發表日期 : 2020-01-21 12:41

 

這題一堆人抄 inv 的程式碼,連註解都一字不漏,真是厲害。

還有這次系統異動之後,原本開 26MB 記憶體會出現錯誤,已改 30MB。

 
#20434: Re:C的


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
e080. read and write -- it's david | From: [49.158.83.43] | 發表日期 : 2020-01-22 20:34

 

這題一堆人抄 inv 的程式碼,連註解都一字不漏,真是厲害。

還有這次系統異動之後,原本開 26MB 記憶體會出現錯誤,已改 30MB。

心態問題。反正被抄的人沒有什麼損失,而是抄的那些人失去了練習的機會而已。

請容我在此表示:

ㄏㄏ

 
#20435: Re:C的


asnewchien@gmail.com (david)

學校 : 不指定學校
編號 : 68108
來源 : [1.168.27.116]
最後登入時間 :
2024-03-31 17:58:15
e080. read and write -- it's david | From: [111.246.58.104] | 發表日期 : 2020-01-22 20:41

 

這題一堆人抄 inv 的程式碼,連註解都一字不漏,真是厲害。

還有這次系統異動之後,原本開 26MB 記憶體會出現錯誤,已改 30MB。

心態問題。反正被抄的人沒有什麼損失,而是抄的那些人失去了練習的機會而已。

請容我在此表示:

ㄏㄏ


print('ㄏ' * 3)

 
ZeroJudge Forum