[問題] 從檔案讀進一連串的整數並偵測換行

看板C_and_CPP (C/C++)作者 (...)時間12年前 (2013/07/27 13:29), 編輯推噓0(0028)
留言28則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev-C++ 4.9.9.2 問題(Question): 我有一個.txt檔案,檔案內容為: 10101 01001 00011 我想把每列讀到a[5]內,並且從字串轉成int,也就是 a[0] = 1, a[1] = 0, a[2] = 1, a[3] = 0, a[4] = 1 但這在函式內,我希望下一次呼叫此函式可以把第二列讀a[5]內,也就是 a[0] = 0, a[1] = 1, a[2] = 0, a[3] = 0, a[4] = 1,依此類推 但是我不知道如何在下一次呼叫時換行...Orz 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> const char *file = "C:\\test_01.txt"; void read(int *a); int main(void) { int a[5]; int i; for(i=0;i<2;i++) { read(a); putchar('\n'); //結果兩次都是10101 } system("pause"); return 0; } void read(int *a) { int i; FILE *fptr; fptr = fopen(file,"r"); //每次呼叫都要開檔一次,有辦法開一次就好了嗎? if(fptr!=NULL) { char temp[2] = {0}; for(i=0;i<5;i++) { fscanf(fptr,"%c",temp); a[i] = atoi(temp); printf("a[%d]=%d\t",i,a[i]); } } else printf("read file error!"); } 謝謝各位前輩指點 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.214.89

07/27 14:01, , 1F
static?
07/27 14:01, 1F

07/27 14:06, , 2F
把fopen用在main不就可以只開一次了....@@"
07/27 14:06, 2F

07/27 14:08, , 3F

07/27 14:42, , 4F
謝謝前輩,請問加上fscanf(fptr,"%c",temp)是什麼意思?
07/27 14:42, 4F

07/27 14:46, , 5F
是把\0給讀入嗎?
07/27 14:46, 5F

07/27 15:05, , 6F
對,要順便讀換行字元\n
07/27 15:05, 6F

07/27 15:48, , 7F
我換成fscanf(fptr,"\n",temp)也可以得到同樣的結果
07/27 15:48, 7F

07/27 15:51, , 8F
讀入字串結束符號\0也有換行的功能嗎?謝謝前輩指點
07/27 15:51, 8F

07/27 15:53, , 9F
\0是空格而非換行,有關反斜線\的東西可以上網查。
07/27 15:53, 9F

07/27 15:55, , 10F
好像有點講錯,\0應該叫null character,也就是空的字元...
07/27 15:55, 10F

07/27 15:55, , 11F
所以fscanf(fptr,"%c",temp)是把\0\n給讀入的意思嗎?
07/27 15:55, 11F

07/27 15:59, , 12F
只有\n,txt和C的字串不一樣...
07/27 15:59, 12F

07/27 16:01, , 13F
原來如此,我把"%c"換成"\0"或"\n"或"\0\n"都會得到相同
07/27 16:01, 13F

07/27 16:01, , 14F
的結果,所以不知道這串的意思 Orz
07/27 16:01, 14F

07/27 16:07, , 15F
但為什麼fscanf(fptr,"\0",temp);也可以呢?
07/27 16:07, 15F

07/27 16:23, , 16F
用"\0",第二個陣列結果是對的嗎?怎麼我試過是錯的@@"
07/27 16:23, 16F
真對不起,我改了一點小地方,用"\0"就可以了,但我不知道為什麼 fscanf(fptr," %c",temp); //%c前面有"空白" a[i] = atoi(temp); 這樣下面這五個都可以達到換行的作用 什麼都不打 fscanf(fptr,"%c",temp); //讀入.txt的 \n fscanf(fptr,"\n",temp); fscanf(fptr,"\0",temp); fscanf(fptr,"\0\n",temp); 但如果 fscanf(fptr,"%c",temp); //%c前面沒有空白 a[i] = atoi(temp); 則 fscanf(fptr,"%c",temp); //讀入.txt的 \n fscanf(fptr,"\n",temp); //正確 fscanf(fptr,"\0",temp); //讀取錯誤! fscanf(fptr,"\0\n",temp); //讀取錯誤! ※ 編輯: andy2007 來自: 140.114.214.89 (07/27 16:31)

07/27 16:31, , 17F
"\0\n"我試了也是錯的耶= ="
07/27 16:31, 17F
※ 編輯: andy2007 來自: 140.114.214.89 (07/27 16:45)

07/27 16:50, , 18F
" %c"表示%c前一格如果有空格或換行字元,會把它略過...
07/27 16:50, 18F

07/27 16:52, , 19F
"\0"則是如果下一個字元是\0,則把那個字元掠過。
07/27 16:52, 19F

07/27 16:52, , 20F
不過txt應該沒有\0,所以你可以把雙引號內的\0當作不存在
07/27 16:52, 20F

07/27 16:54, , 21F
按照這個原則,你應該就要能明白這是怎麼回事了。
07/27 16:54, 21F

07/27 16:54, , 22F
還有雙引號內如果沒有%c,temp是不會有任何變化的...
07/27 16:54, 22F
※ 編輯: andy2007 來自: 140.114.214.89 (07/29 16:14)

07/30 14:59, , 23F
如果是我,我會想這樣讀http://codepad.org/nqqa6mWf
07/30 14:59, 23F

07/30 15:54, , 24F
謝謝TsinTa和longlongint前輩的幫忙~
07/30 15:54, 24F

07/30 15:55, , 25F
想請問為什麼使用"%1d"就不會出錯呢?
07/30 15:55, 25F

07/30 16:09, , 26F
而且還具有換行的功能
07/30 16:09, 26F

07/30 19:11, , 27F
%1d的1是長度限制1。 另外,如果scanf沒出現過%c的話
07/30 19:11, 27F

07/30 19:11, , 28F
換行跟空白都會被當成空白字元
07/30 19:11, 28F
文章代碼(AID): #1Hyrh1I2 (C_and_CPP)
文章代碼(AID): #1Hyrh1I2 (C_and_CPP)