2011-07-18 71 views
1

我遇到了一些文件IO問題。文件IO問題

我有這個文件:

db.dat:

Ryan 
12 69.00 30.00 0.00 
Bindy Lee 
25 120.00 89.00 1.00 

這是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define RECORDS 30 
#define LEN 20 

main() 
{ 
    FILE *fptr; 
    fptr = fopen("db.dat", "r"); 
    int i; 
    int counter = 2; 

    for (i = 0; i < counter; i++) 
    { 
     char temp1[LEN]; 
     char temp2[LEN + 10]; 

     fgets(temp1, LEN, fptr); 
     fgets(temp2, LEN, fptr); 
     printf("%s %s", temp1, temp2); 
    } 

    fclose(fptr);  
} 

我應該得到兩條線,但我得到這個相反:

Ryan 
12 69.00 30.00 0.00 
Bindy Lee 

有人可以請幫忙!我不知道爲什麼我沒有得到兩條線,爲什麼我得到空間。很奇怪......謝謝!

+0

請從添加明確的呼聲有關問題標題不要幫助,有些人不喜歡回答問題這樣。 – hugomg

+0

我很抱歉,我保證我不會做它一次。我是新來的CSE世界,正在學習的非正式規則。謝謝你告訴我,我會再次這樣做,不要。 – seyelent

+0

它不是什麼大不了實際成交的。 – hugomg

回答

2

fgets在讀取LEN個字符或到達行尾時停止。我認爲你的問題在於你讓LEN太小。

將您的printf改爲更類似於printf("temp1='%s'\ntemp2='%s'\n", temp1, temp2);的東西,您應該能夠看到實際讀入每個字符串的內容。

+0

你是對的!謝謝! ! – seyelent

+0

感謝所有的人太多,我真正體會到了! – seyelent

1

對於額外" "

變化:

printf("%s %s", temp1, temp2); 

printf("%s%s", temp1, temp2); 

由於串已經包含'\n'

Reference

A newline character makes fgets stop reading, but it is considered a valid 
character and therefore it is included in the string copied to str. 
+0

是的,我求你但是這沒有幫助。我現在解決了這個問題。謝謝! – seyelent

1

你只是讀取40個字節。如果增加LEN您可以閱讀餘下的線路,

或代替的字節數閱讀,你可以讀取整個行,直到有一個新的生產線

#include <string.h> 

#define RECORDS 30 
#define LEN 20 

main() 
{ 
    FILE *fptr; 
    fptr = fopen("b.db", "r"); 
    int i; 
    int counter = 4; 

    for (i = 0; i < counter; i++) 
    { 
     char temp1[LEN]; 
     fscanf(fptr, "%[^\n]%*c", temp1); 
     printf("%s\n", temp1); 
    } 

    fclose(fptr);  
} 

如果你有興趣閱讀名稱,並在同一時間,你可以調整有點象他相應的記錄,

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define RECORDS 30 
#define LEN 20 

main() 
{ 
    FILE *fptr; 
    fptr = fopen("b.db", "r"); 
    int i; 
    int counter = 2; 

    for (i = 0; i < counter; i++) 
    { 
     char temp1[LEN]; 
     char temp2[RECORDS]; 
     fscanf(fptr, "%[^\n]%*c%[^\n]%*c", temp1, temp2); 
     printf("%s ---- %s\n", temp1, temp2); 
    } 

    fclose(fptr);  
} 
+0

謝謝!!!!!! – seyelent

+0

使用'fscanf'這樣是不安全的,因爲它沒有溢出保護。增加溢出保護是可能的,但要正確做到這一點非常困難。在'fgets'過'fgets'我決不會建議使用'fscanf'給初來乍到的語言,只有很少的(並且根據具體情況)我會建議使用它給任何人。這不是其中之一。 -1 –

+0

什麼樣的情況? 我用我的實際的程序與fgets(這僅僅是一個節選),然後用在我從與fgets得到了字符串sscanf的。這是正常的,還是以同樣的方式有害? – seyelent

1

假設你正在做結構化的輸入,你可以考慮使用scanf函數,而不是與fgets的。我不清楚你在說什麼,「我應該得到兩條線」。

應該工作爲了這個美好的

代碼會是這樣的:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define RECORDS 30 
#define LEN 20 

main() 
{ 
    FILE *fptr; 
    fptr = fopen("db.dat", "r"); 
    int i; 
    int counter = 3; 

    for (i = 0; i < counter; i++) 
    { 
     char temp1[LEN]; 
     char temp2[LEN + 10]; 

     fgets(temp1, LEN, fptr); 
     fgets(temp2, LEN, fptr); 
     printf("%s%s", temp1, temp2); 
    } 

    fclose(fptr); 
} 

最重要的事情是你不讀的最後一行,你並不需要的「%s%S的空間「在printf語句中。 「%s%s」應該可以正常工作。

+0

我只是把空間來幫助區分。但是我知道你的意思。謝謝,我忽略了這一點。 – seyelent

1

我試試看,並調試;我發現這個問題就像是missno說的: 「fgets在讀取LEN字符或到達行尾後停止。我認爲你的問題在於你讓LEN太小。「

第一次(count = 0),temp2沒有得到'\ n'; 第二次(count = 0),temp1得到'\ n'; 這就是爲什麼,你可以有一個嘗試和調試代碼.....