[爆卦]scanf不換行是什麼?優點缺點精華區懶人包

為什麼這篇scanf不換行鄉民發文收入到精華區:因為在scanf不換行這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者andy2007 (...)看板C_and_CPP標題[問題] 函式讀檔換行時間Sat Jul ...



開發平台(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
tjjh89017:static? 07/27 14:01
TsinTa:把fopen用在main不就可以只開一次了....@@" 07/27 14:06
TsinTa:http://codepad.org/WxDAOQW8 07/27 14:08
andy2007:謝謝前輩,請問加上fscanf(fptr,"%c",temp)是什麼意思? 07/27 14:42
andy2007:是把\0給讀入嗎? 07/27 14:46
TsinTa:對,要順便讀換行字元\n 07/27 15:05
andy2007:我換成fscanf(fptr,"\n",temp)也可以得到同樣的結果 07/27 15:48
andy2007:讀入字串結束符號\0也有換行的功能嗎?謝謝前輩指點 07/27 15:51
TsinTa:\0是空格而非換行,有關反斜線\的東西可以上網查。 07/27 15:53
TsinTa:好像有點講錯,\0應該叫null character,也就是空的字元... 07/27 15:55
andy2007:所以fscanf(fptr,"%c",temp)是把\0\n給讀入的意思嗎? 07/27 15:55
TsinTa:只有\n,txt和C的字串不一樣... 07/27 15:59
andy2007:原來如此,我把"%c"換成"\0"或"\n"或"\0\n"都會得到相同 07/27 16:01
andy2007:的結果,所以不知道這串的意思 Orz 07/27 16:01
andy2007:但為什麼fscanf(fptr,"\0",temp);也可以呢? 07/27 16:07
TsinTa:用"\0",第二個陣列結果是對的嗎?怎麼我試過是錯的@@" 07/27 16:23

真對不起,我改了一點小地方,用"\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)
TsinTa:"\0\n"我試了也是錯的耶= =" 07/27 16:31
※ 編輯: andy2007 來自: 140.114.214.89 (07/27 16:45)
TsinTa:" %c"表示%c前一格如果有空格或換行字元,會把它略過... 07/27 16:50
TsinTa:"\0"則是如果下一個字元是\0,則把那個字元掠過。 07/27 16:52
TsinTa:不過txt應該沒有\0,所以你可以把雙引號內的\0當作不存在 07/27 16:52
TsinTa:按照這個原則,你應該就要能明白這是怎麼回事了。 07/27 16:54
TsinTa:還有雙引號內如果沒有%c,temp是不會有任何變化的... 07/27 16:54
※ 編輯: andy2007 來自: 140.114.214.89 (07/29 16:14)
longlongint:如果是我,我會想這樣讀http://codepad.org/nqqa6mWf 07/30 14:59
andy2007:謝謝TsinTa和longlongint前輩的幫忙~ 07/30 15:54
andy2007:想請問為什麼使用"%1d"就不會出錯呢? 07/30 15:55
andy2007:而且還具有換行的功能 07/30 16:09
longlongint:%1d的1是長度限制1。 另外,如果scanf沒出現過%c的話 07/30 19:11
longlongint:換行跟空白都會被當成空白字元 07/30 19:11

你可能也想看看

搜尋相關網站