ファイルの読み込み

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
REN

ファイルの読み込み

#1

投稿記事 by REN » 9年前

ファイルを読み込み、文字列keyを入力しコード内に入力した文字列keyがあればその行の文字列を出力させるという内容なんですが、
34行目からの部分で入力されたkeyの文字列があれば出力されるように作ったのですが、どうしても思い通りに出力されません。
問題点と改善策を教えてください。
よろしくお願いします。

コード:

#include<stdio.h>
#define MAX 150

int search(char *fn, char *key);

int main(void)
{
	int i;
	char fname[MAX], key[MAX];
	//Source.cppを入力
	printf("文字列を入力:"); scanf("%s", fname);

	printf("文字列を入力:"); scanf("%s", key);

	i = search(fname, key);

	printf("\n%sの数:%d\n", key, i);

	return 0;
}
int search(char *fn, char *key)
{
	int i;
	char str[MAX];
	FILE *fp;

	fp = fopen(fn, "r");
	if (fp == NULL){
		printf("ファイルオープン失敗");
		return 1;
	}

	i = 0;
	while (fscanf(fp, "%s", &str) != EOF){
		if (key == str){
			i++;
			printf("%s\n", str);
		}
		printf("%2d:%s\n", i, str);
	}
	fclose(fp);

	return i;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイルの読み込み

#2

投稿記事 by みけCAT » 9年前

  • fscanfの%sでは空白文字で読み込みが止まるので、keyの内容がある行の文字列が得られません。fgets関数を使うといいでしょう。
  • fscanfの%sやfgetsで文字列を読み込む時のポインタとして&strを渡すのはここでは間違っています。str(この配列の先頭要素を指すポインタに自動で変換される)を渡してください。
  • fgetsでstrに文字列を読み込む場合、改行文字も含めて読み込まれるので、その下のprintfで改行文字を出力すると被ってしまいます。従って、これらの改行文字を消すといいでしょう。
  • C言語で文字列の比較は、一般に==演算子1回ではできません。string.hをインクルードし、strcmp関数を使って比較するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

REN

Re: ファイルの読み込み

#3

投稿記事 by REN » 9年前

すいません最終的にはどういった形になるのですか?

box
記事: 2002
登録日時: 14年前

Re: ファイルの読み込み

#4

投稿記事 by box » 9年前

ビルドしただけで実行させていないので、正しく動くかどうかはわかりません。

コード:

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

#define MAX (150)

int search(char *fn, char *key);

int main(void)
{
    int i;
    char fname[MAX], key[MAX];

    printf("ファイル名を入力:"); fgets(fname, MAX, stdin);
    fname[strlen(fname) - 1] = '\0';

    printf("探したい文字列を入力:"); fgets(key, MAX, stdin);
    key[strlen(key) - 1] = '\0';

    i = search(fname, key);
    printf("\n%sの数:%d\n", key, i);
    return 0;
}

int search(char *fn, char *key)
{
    int i;
    char str[MAX];
    FILE *fp;

    fp = fopen(fn, "r");
    if (fp == NULL){
        printf("ファイルオープン失敗");
        // return 1;   1個あると誤解されかねないので
        exit(1);        // 思い切って終了させてしまう
    }

    i = 0;
    while (fgets(str, MAX, fp)) {
        if (strstr(str, key)) i++;
    }
    fclose(fp);
    return i;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイルの読み込み

#5

投稿記事 by みけCAT » 9年前

box さんが書きました:ビルドしただけで実行させていないので、正しく動くかどうかはわかりません。
行の文字列を出力させる部分が全く無いので、実行しなくても正しく動かないことは用意にわかりますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

REN

Re: ファイルの読み込み

#6

投稿記事 by REN » 9年前

機動は確認できました。
ここまでできれば僕にできるのでありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る