C でファイルから読み取り、すべての単語を配列に配置する必要があります。単語にスペースを含めないでください (スペースに達すると、その単語のコピーを終了する必要があります)。
fscanf(arquivo,"%s",palavras[i].string);
ほぼ機能していますが、ファイル上で見つかったときに \n が含まれていません..
fgets (temp , 100 , arquivo);
スペースが見つかったときに停止しないため、機能しません。
皆さんはどう思いますか?
fgetsとsscanflike を組み合わせて使用できます。
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ラインを保持するのに十分なサイズを指定します。もちろん、安定させるにはさらにエラーチェックが必要です。
私はこれに対して別のアプローチを取ります。
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++;
}
}
}
これにより、文字配列 (または文字列) の配列が作成され、スペースが見つかるまで各配列に文字が追加されます。スペースが見つかった場合は、それをスキップして次の文字に移動し、新しい文字列を開始します。
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
}