0

C でファイルから読み取り、すべての単語を配列に配置する必要があります。単語にスペースを含めないでください (スペースに達すると、その単語のコピーを終了する必要があります)。

fscanf(arquivo,"%s",palavras[i].string);

ほぼ機能していますが、ファイル上で見つかったときに \n が含まれていません..

fgets (temp , 100 , arquivo);

スペースが見つかったときに停止しないため、機能しません。

皆さんはどう思いますか?

4

4 に答える 4

0

fgetssscanflike を組み合わせて使用​​できます。

ptr = NULL;
ptr = fgets (temp , 100 , arquivo); 
 // Check 1) return value for NULL 2) whether temp has `\n`
 // or read till `\n`

while( ( found = sscanf( ptr, "%s", palavras[i].string ) ) == 1 )
{
    // palavras[i].string has valid string

    ptr += strlen( palavras[i].string ); // next string in
    i++; // next element in array. Overflowing ?
}

strcat( palavras[i].string, "\n" );

fgetsラインを保持するのに十分なサイズを指定します。もちろん、安定させるにはさらにエラーチェックが必要です。

于 2013-07-10T14:14:21.053 に答える
0

私はこれに対して別のアプローチを取ります。

int fd,i,j=0;;
fd = open("nameoffile",O_RDONLY);
char buf[128], word[64];
char *words[128];

while (n=read(fd,buf,sizeof(buf))){
     memset(word,0,sizeof(word));
     for (i=0;i<n;i++){
         if (buf[i] != ' ') word[i] = buf[i];
         else {
              words[j] = malloc(sizeof(word));
              words[j] = word;
              j++;
         }
     }
}

これにより、文字配列 (または文字列) の配列が作成され、スペースが見つかるまで各配列に文字が追加されます。スペースが見つかった場合は、それをスキップして次の文字に移動し、新しい文字列を開始します。

于 2013-07-10T14:16:47.463 に答える
0

fscanfこの場合、任意の種類の空白 (改行を含む) に達すると停止します。を使用fgetsして行全体 (改行を含む) を読み取ってから、strtok繰り返し使用して分割することができます。

例えば:

char temp[100];
char *tok;

fgets (temp , 100 , arquivo);
while ((tok = strtok(temp, " ")) != NULL) {
    // 'tok' points to a null-terminated word with no spaces
}
于 2013-07-10T14:01:35.910 に答える