3

何らかの理由で、次のコードでフレーズを出力すると、fgets 関数がテキスト ファイルの最後の文字を取得していないことがわかりました。すでに mone1 をチェックしたところ、ファイル内のテキストに十分なスペースが与えられていることがわかりました。誰かがその出来事に対する説明と解決策を持っていますか?

Tnx、ディーン。

ps文字列の長さを2文字に変更しても問題の原因ではないと確信していますが、最初の文字のみを出力し(最後の文字は出力しません)、すべて同じ行に書き込まれます.

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

int main(int argc, char * argv[])
{
    printf("ss");
    FILE * sent=NULL;
    FILE * voca=NULL;
    sent=fopen(argv[1],"r");
    voca=fopen(argv[2],"r");
        if(voca==NULL){
        printf("cannot open voca ");
        fclose(voca);
    }
    if(sent==NULL){
        printf("cannot open sent");
        fclose(sent);
    }
    int mone1=0;
    int mone2=0;
    while(EOF!=fgetc(sent))
        mone1++;    
    while(EOF!=fgetc(voca))
        mone2++;    
    fseek(sent,0L,SEEK_SET);
    fseek(voca,0L,SEEK_SET);
    char* phrase=(char*)(malloc(mone1*sizeof(char)));
    char* voc=(char*)(malloc(mone2*sizeof(char)));
    fgets(phrase,mone1,sent);
    fgets(voc,mone2,voca);
    printf("%s",phrase);
    return 0;
}
4

2 に答える 2

6
char *fgets(char * restrict s, int n, FILE * restrict stream);

この関数は、 stream が指すストリームから、 が指す配列に、 で指定された数より最大で 1 つ少ないfgets文字を読み取ります。ns

つまり、文字を読み取る必要がある場合は、少なくとも as をmone1渡し、バッファも十分であることを確認してください。その理由は、最後に末尾を追加するためです。nmone1 + 1fgets\0

于 2013-10-05T14:41:51.943 に答える
1

fgets()size-1から文字を読み取りfile stream、最後に Null 文字を追加します。

例えば

fgets(buf,2,file_stream);

buf[0]=some_character and buf[1]='\0';
于 2013-10-05T14:43:08.060 に答える