2013-03-15 102 views
0

我需要從文件中讀取文本並將其傳回主函數,並且在EOF之後我總是會增加3個字符爲什麼會發生這種情況?讀取一個文件並返回到緩衝區變量c

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

int activenw(char *); 

void main() 
{ 
    char act_con[50]; 
    int len,i; 
    len=activenw(act_con); 
    for(i=0;i<=len;i++) 
    { 
     printf("%c",act_con[i]); 
    } 
} 

int activenw(char *buff) 
{ 
    char ch="\0"; 
    FILE *fp; 
    int i=0; 
    fp=fopen("abc.txt","r"); 
    if(fp==NULL) 
    { 
     printf("Error opening a file :"); 
     exit(0); 
    } 
    while((ch=fgetc(fp))!=EOF) 
    { 
     printf("%c",ch); 
     *buff=ch; 
     buff++; 
     i++; 
    } 
    fclose(fp); 
    return i; 
} 

這個實現是否正確?

+2

void main()不是一個好兆頭。與縮進相同。不傾向於做比這個提示更多的東西:fgetc()返回什麼類型?當你明白爲什麼時,你也會意識到ch的類型不正確。 – 2013-03-15 01:23:17

回答

1

在你的函數中,你實際上不會空字符串。除非你的「字符串」能夠包含NUL字符,否則將視爲字符串而不是字符數組會更好。然而,這只是一般性建議,並不真正與您的具體問題有關。

首先,從fgetc返回代碼是int(不char),因爲它必須能夠代表每一個字符EOF

其次,"\0"不是一個字符,它是一個字符指針爲一個字符串常量。如果你想NUL 字符,你應該使用單引號,而不是雙引號。

最後,你在main循環打印出的文字:它採用<=這將給你一個或多個字符比你想要的 - 使用<代替。

+0

是的,但這並不重要,因爲他使用len打印而不是%s。 – 2013-03-15 01:25:30

+0

我已經用'\ 0'(即)在我的代碼* buff ='\ 0'中終止了字符串。我已經將i <= len移至i 2013-03-15 01:58:22

+0

@NaggappanRM,當它應該是一個'int'時,你仍然有'ch'作爲'char'。但是,即使出現這種錯誤,您在(現已刪除的)註釋中給出的代碼對我來說工作得很好,字符串hello(來自文件)和換行符(也在文件中)。如果你轉儲abc.txt(如果你在Linux上)'od -xcb abc.txt',你可能會在那裏看到換行符。 – paxdiablo 2013-03-15 02:05:10

0

假設len == 0,這個循環會運行多少次? for(i=0;i<=len;i++)是你如何打印個字符?

Can a char代表unsigned char的所有值嗎?它可能有這種能力......如果可以,它也可以代表負值EOF?假設char是無符號類型,請考慮(ch=fgetc(fp))的簽名。 (unsigned char) EOF永遠等於EOF? fgetc返回int,並且這樣做是因爲int可以表示每個unsigned char值以及負值EOF的值。 ch顯然應該是int,所以你可以正確區分EOF(非字符)和unsigned char的值。

+0

因此,如果我不應該使用fgetc?那麼什麼功能會更好?如果我使用fscanf(fp,「%c」,ch);給我一個警告和分段錯誤(核心轉儲)錯誤 – 2013-03-15 02:12:18

+0

我說你不應該使用'fgetc'?再讀一遍。當'fscanf'沒有閱讀手冊時,可以預期這種警告和段錯誤。 'ch'的類型是什麼?當你賦予'%c'格式說明符時'fscanf'會期望哪種類型?哪個手冊告訴你這個? – Sebivor 2013-03-15 02:29:15

0

首先,將我< = len更改爲我< len,以便它不會再計數1個字符。其次,使用hexdump程序檢查你的文件是否沒有額外的新行字符或初始unicode字節順序標記。