2

このようなテキストファイルがあります

ユーザー1|パスワード
1 ユーザー2|パスワード2

「user1 | password1」などの文字列があります。テキスト ファイルの各行をこの文字列と比較する必要があります。

    FILE *fp;
    fp = fopen("user_info_file.txt", "r");
    while(fgets(str, 10, fp)!=NULL){
    n = write(newsockfd, "STR:", 4);
    n = write(newsockfd, str, 15);}

そして、strcmp に進みます。サーバーにこれをクライアントに書き込ませるため、書き込み関数を使用します。

テキストが読み取られているかどうかを確認するために、ランダムな値として 15 を入力しました (範囲内です)。しかし、str を出力すると、str には何も含まれていません。「STR:」と表示されるだけで、次の行にプロンプ​​トが表示されます。

user_info_file.txt のデータ(少なくとも1行目)をstrに読み込む方法を教えてください。私はこれに何時間も費やしましたが、私はそれを得ることができないようです. 初心者ですが、ご容赦ください。

編集: 基本的に私は IM アプリケーションを作成しています。ユーザーはユーザー名とパスワードを入力して登録します。これはサーバーに送信され、サーバーはそれを上記の形式で user_info_file に保存します。ユーザーが登録したら、ログインできる必要があります。彼らはユーザー名とパスワードを入力し、これもサーバーに送信します。次に、サーバーがこの文字列を user_info_file の既存のエントリと比較して、ログインを検証する必要があります。したがって、サーバーが user_info_file のすべての行をチェックし、それをユーザーが入力したものと比較する必要があります。

ので、私は持っています

char* str = new char[256];
    FILE *fp;
    fp = fopen("user_info_file.txt", "r");
    while(fgets(str, 10, fp)!=NULL){
    n = write(newsockfd, "STR:", 4);
    n = write(newsockfd, str, 15);}
    if(strcmp(buffer, str) == 0)
        n = write(newsockfd, "Logged in", 9);
    else
        n = write(newsockfd, "No such username", 16);

基本的に、user_info_file の各行を str に読み込もうとしています。次に、読み取り行ごとに str をバッファと比較します。バッファには、クライアントが送信したログイン情報が格納されます。それらが一致する場合、ログインは成功するはずです。

しかし、str を書いても、何も出力されません。15 は str から書き込む文字数ですよね?したがって、数値がたとえば 5 だったとしても、少なくとも「user1」または「user2」、または user_info_file の SOME 行の最初の 5 文字を出力する必要があります。しかし、ファイルから str に何かが読み取られているようには見えません。

私はそれを明確にしたことを願っています。私に何ができる?私は機知に富んでいます。

4

1 に答える 1

0

あなたの場合、fgets関数を使用して char ごとにファイル char から読み取るのは便利だとは思いません。fscanfを使用することをお勧めします。これにより、さまざまな形式の値を同時に読み取るなど、より多くの機会が提供されます。ここでは、fscanf を使用してファイルから必要な情報を取得する方法を示すために、いくつかのコード スニペットを取得しました。

int main(void)
{
    char str[256];
    char checkLogin[256];
    char checkPassword[256];
    FILE *fp = fopen("user_info_file.txt", "r");
    /*while(fgets(str, 10, fp)!=NULL){
    n = write(newsockfd, "STR:", 4);
    n = write(newsockfd, str, 15);}*/
    int scanSucceed = 1;
    do
    {
        scanSucceed = fscanf(fp,"%s|%s ", checkLogin, checkPassword); 
        if (!strcmp(checkLogin, buffer))
        {
        // in case if password for that login match
            if (!strcmp(checkPassword, password))
            {
                ValidLogin = true;
                scanSucceed = -1; // exit from while loop
            }
        }
    }
    while(scanSucceed != -1); // while string was read
}
于 2012-11-15T07:54:36.893 に答える