[英]Using fgets to read strings from file in C
我正在嘗試從文件中讀取字符串,該文件中的每個字符串都換行,但是我認為它讀取一次換行符而不是字符串,我也不知道為什么。 如果我打算以錯誤的方式讀取字符串,請糾正我。
i=0;
F1 = fopen("alg.txt", "r");
F2 = fopen("tul.txt", "w");
if(!feof(F1)) {
do{ //start scanning file
fgets(inimene[i].Enimi, 20, F1);
fgets(inimene[i].Pnimi, 20, F1);
fgets(inimene[i].Kood, 12, F1);
printf("i=%d\nEnimi=%s\nPnimi=%s\nKaad=%s",i,inimene[i].Enimi,inimene[i].Pnimi,inimene[i].Kood);
i++;}
while(!feof(F1));};
/*finish getting structs*/
printf在那里讓我看到被讀入的內容,這是結果
i=0
Enimi=peter
Pnimi=pupkin
Kood=223456iatb i=1
Enimi=
Pnimi=masha
Kaad=gubkina
i=2
Enimi=234567iasb
Pnimi=sasha
Kood=dudkina
如您所見,讀取第一個結構后,將有一個空白(換行符?)onct,然后將所有內容轉移。 我想我可以讀取一個虛擬字符串來吸收多余的空格,然后什么都不會改變,但這無助於我理解問題並在將來避免。
編輯1:我知道它會停在換行符處,但仍會讀取它。 我想知道為什么它在第三個字符串期間不讀取它並轉移到第四個字符串,而不是將第四個字符串作為源的第四行,但是它只發生一次。 該文件的格式是這樣的
peter
pupkin
223456iatb
masha
gubkina
234567iasb
sasha
dudkina
123456iasb
fgets
讀取換行符時將停止讀取,但是該換行符被視為有效字符,並且包含在返回的字符串中。
如果要刪除它,則需要自己修剪:
length = strlen(str);
if (str[length - 1] == '\n')
str[length - 1] = '\0';
其中str
是從文件中讀取數據的字符串,而length
大小為size_t
。
回答以下問題的編輯:在三次讀取期間未讀取換行符的原因是因為您沒有讀取足夠的字符。 給fgets
限制為12個字符,這意味着它實際上最多可以讀取11個字符,因為它必須在末尾添加空終止符。
您讀取的行在換行符之前的長度為11個字符。 請注意,輸出時該行的末尾有一個空格:
Kood=223456iatb i=1
^
如前所述,如果緩沖區中有足夠的空間,則fgets()
包含換行符的數據讀入緩沖區,而null則終止該行。 如果在遇到換行符之前緩沖區中沒有足夠的空間,則fgets()
復制它可以的內容(緩沖區的長度減去一個字節),然后null終止該字符串。 該庫將從fgets()
在下一次迭代中停止的地方繼續讀取。
不要弄亂小於2個字節長的緩沖區。
請注意, gets()
會刪除換行符(但不能保護您免受緩沖區溢出的影響,因此請不要使用它)。 如果一切按當前計划進行,則gets()
將從下一版C標准中刪除; 從C庫中刪除它需要很長時間(它將變成非標准的-或非標准的-可供濫用的附加功能)。
您的代碼應檢查每個fgets()
函數調用:
while (fgets(inimene[i].Enimi, 20, F1) != 0 &&
fgets(inimene[i].Pnimi, 20, F1) != 0 &&
fgets(inimene[i].Kood, 12, F1) != 0)
{
printf("i=%d\nEnimi=%s\nPnimi=%s\nKaad=%s", i, inimene[i].Enimi, inimene[i].Pnimi, inimene[i].Kood);
i++;
}
有一些do / while循環的地方; 但是,它們並不經常使用。
如果Enimi / Pnimi / Kood是數組而不是指針:
while( fgets(inimene[i].Enimi,sizeof inimene[i].Enimi,F1) &&
fgets(inimene[i].Pnimi,sizeof inimene[i].Pnimi,F1) &&
fgets(inimene[i].Kood,sizeof inimene[i].Kood,F1) )
{
if( strchr(inimene[i].Enimi,'\n') ) *strchr(inimene[i].Enimi,'\n')=0;
if( strchr(inimene[i].Pnimi,'\n') ) *strchr(inimene[i].Pnimi,'\n')=0;
if( strchr(inimene[i].Kood,'\n') ) *strchr(inimene[i].Kood,'\n')=0;
printf("i=%d\nEnimi=%s\nPnimi=%s\nKaad=%s", i, inimene[i].Enimi, inimene[i].Pnimi,inimene[i].Kood);
i++;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.