0

fgets で stdin から取得した文字列と、fscanf でファイルから取得した別の文字列を比較する必要があります (そして fprintf でファイルに書き込みます)。標準入力とファイルからの読み取りには、必然的に2つの関数を使用する必要があります。どうすればそれができますか?fgetsも「\ 0」バイトを格納しているのを見たことがありますが、fscanfはありません。

これはコードです:

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

typedef struct asd {
    char a[20];
    char b[20];
} struttura;


void stampa_file() {
struttura *tmp = NULL;
struttura *letto = NULL;
FILE *file;

tmp = (struttura *)malloc(sizeof(struttura));
letto = (struttura *)malloc(sizeof(struttura));
file = fopen("nuovoFile", "r");
printf("compare:\n");\
fgets(letto->a, sizeof(letto->a), stdin);
fgets(letto->b, sizeof(letto->b), stdin);
while(!feof(file)) {
    fscanf(file, "%s %s\n", tmp->a, tmp->b);
    printf("a: %s, b: %s\n", tmp->a, tmp->b);
    if(strcmp(letto->a, tmp->a) == 0 && strcmp(letto->b, tmp->b)) {
        printf("find matching\n");
    }
}
free(tmp);
free(letto);
}

int main() {
struttura *s = NULL;
FILE *file;

s = (struttura *)malloc(sizeof(struttura));

file = fopen("nuovoFile", "a+");
printf("");
fgets(s->a, sizeof(s->a), stdin);
printf("");
fgets(s->b, sizeof(s->b), stdin);
fprintf(file, "%s%s\n", s->a, s->b);
fclose(file);
stampa_file();

free(s);
return 0;
}
4

3 に答える 3

2

あなたがしようとしていることに応じて、ここに多くの潜在的な問題があります

  • fgets行 (改行を含む) をfscanf(.."%s"..)読み取り、空白で区切られたトークンを読み取ります。まったく同じではありません。

  • fscanf(.."%s"..)書き込み先として指定したバッファーの境界をチェックしません。fscanf(.."%19s"..)20 バイトのバッファーに 20 バイト (NUL ターミネーターを含む) を超えて書き込まないようにする必要があります。

  • while(!feof(fp))ほぼ常に間違っています。 feofファイルの最後にいるかどうかはわかりませんが、ファイルの最後を超えて読み込もうとしたかどうかはわかります。したがって、ファイルの最後まで読み取っただけで、それ以降はまだ読み取っていない場合、feofは false を返しますが、次の読み取りは失敗します。

  • の戻り値をチェックして、fscanf読みたいものが読み取られていることを確認する必要があります (そして、実際に出力バッファーに何かを書き込んでいます)。上記と組み合わせると、ループを次のようにする必要があることを意味します。

    while (fscanf(fp, "%19s%19s", tmp->a, tmp->b) == 2) {
            :
    
于 2012-09-05T21:54:52.233 に答える
0

どうすればそれができますか?fgetsも「\ 0」バイトを格納しているのを見たことがありますが、fscanfはありません。

fscanf のドキュメントを読んでテストしたところ、うまくいきました。

#include <stdio.h>

int main()
{
    char str[100] = { 1 }; // intentionally initialized to nonzero junk
    fscanf(stdin, "%s", str);
    if (strcmp(str, "H2CO3") == 0)
        printf("This is me\n");
    else
        printf("This is not me\n");
    return 0;
}
于 2012-09-05T19:08:10.920 に答える
0

scanf または fscanf を %s と共に渡すと、文字列は改行文字または空白文字で終了します。fgets は \n まで待機します。

したがって、あなたが呼び出す場合

fscanf(stdin, "%s", str);

vs

fgets(str);

ファイルには「こんにちは」が含まれています

fscanf には「Hello」のみが含まれますが、fgets は文字列全体を返します。

于 2012-09-05T19:39:12.820 に答える