關鍵就一個 : 如何在不消耗大量儲存空間下,任意移動 " 讀資料的進入點 "
學過檔案的 IO 的話,應該會記得要先宣告一個 FILE 指標,使用這個指標進行資料流的處理
而在 C 當中,有一個函式可以使指標回到檔案開頭,就是 rewind ()
而這題怎麼使用 rewind () 呢,我的做法如下
先找到 " 空格 ",也就是忽略第一個數字
然後一邊讀字串一邊輸出,把第二個數字先輸出,之後輸出空格
使用 rewind ( stdin ),將指標回到最前面,輸出第一個數字即可
( stdin 就是輸入流,因為無法知道要開啟的測資檔案名,直接使用即可 )
( stdin 是 stdio.h 定義的一個巨集,不需要再另外宣告了 )
關鍵就一個 : 如何在不消耗大量儲存空間下,任意移動 " 讀資料的進入點 "
學過檔案的 IO 的話,應該會記得要先宣告一個 FILE 指標,使用這個指標進行資料流的處理
而在 C 當中,有一個函式可以使指標回到檔案開頭,就是 rewind ()
而這題怎麼使用 rewind () 呢,我的做法如下
先找到 " 空格 ",也就是忽略第一個數字
然後一邊讀字串一邊輸出,把第二個數字先輸出,之後輸出空格
使用 rewind ( stdin ),將指標回到最前面,輸出第一個數字即可
( stdin 就是輸入流,因為無法知道要開啟的測資檔案名,直接使用即可 )
( stdin 是 stdio.h 定義的一個巨集,不需要再另外宣告了 )
原來 C 有 rewind() 可以用,受教了XD
本人的作法是自己用 C++ 串流的 streambuf 底下的 pubseekoff()、pubseekpos() 以及 sgetn() 函式自己慢慢刻出 AC 的。
很輕小,執行速度也快,可是過程艱辛 (本人幾乎沒在碰串流的處理)。
順帶一提, AC 了這題之後,可以試試看挑戰 c631: 記憶力試驗 喔。
原來 C 有 rewind() 可以用,受教了XD
本人的作法是自己用 C++ 串流的 streambuf 底下的 pubseekoff()、pubseekpos() 以及 sgetn() 函式自己慢慢刻出 AC 的。
很輕小,執行速度也快,可是過程艱辛 (本人幾乎沒在碰串流的處理)。
順帶一提, AC 了這題之後,可以試試看挑戰 c631: 記憶力試驗 喔。
奇怪的是,我 c631 一直 NA 0%,但是有些輸出卻是對的
顯示錯的地方也完全看不到,估計是字串的尾端有錯
一直找不到問題,有點煩 .......
c631 那題像夾娃娃機一樣,你要讓夾子能在測資上方盤旋。
我找到問題了,應該是輸出格式問題,以及暫存用的緩衝字元陣列沒有清空,至少解開了
關鍵就一個 : 如何在不消耗大量儲存空間下,任意移動 " 讀資料的進入點 "
學過檔案的 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個慢慢讀,可是也不知道怎麼判斷還剩多長 }*/
請問在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 的狀態。
以上。
請問在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 的狀態。
以上。
試過了,應該不是
不過還是謝謝您的建議~
請問在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> 裡
或許可以試試看加這個標頭檔 ?
請問在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)
請問在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 的串流指標。
以上。
請問在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函式嗎?
請問在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 的串流指標云云。
請問在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)
謝謝您的幫忙~
這題一堆人抄 inv 的程式碼,連註解都一字不漏,真是厲害。
還有這次系統異動之後,原本開 26MB 記憶體會出現錯誤,已改 30MB。
這題一堆人抄 inv 的程式碼,連註解都一字不漏,真是厲害。
還有這次系統異動之後,原本開 26MB 記憶體會出現錯誤,已改 30MB。
心態問題。反正被抄的人沒有什麼損失,而是抄的那些人失去了練習的機會而已。
請容我在此表示:
ㄏㄏ
這題一堆人抄 inv 的程式碼,連註解都一字不漏,真是厲害。
還有這次系統異動之後,原本開 26MB 記憶體會出現錯誤,已改 30MB。
心態問題。反正被抄的人沒有什麼損失,而是抄的那些人失去了練習的機會而已。
請容我在此表示:
ㄏㄏ
print('ㄏ' * 3)