簡體   English   中英

使用fgets從C中的文件讀取字符串

[英]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循環的地方; 但是,它們並不經常使用。

fgets函數讀取換行符char作為讀取的字符串的一部分。

fgets描述

fgets()函數應從流中將字節讀取到s指向的數組中,直到讀取n-1個字節,或者讀取換行符並將其傳輸到s ,或者遇到文件結束條件。 然后,該字符串以空字節終止。

如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM