質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.60%

C言語でtxtファイルの文字列を変換させたい

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,326
退会済みユーザー

退会済みユーザー

C言語でtxtファイルにある文字列を変換させたい

ある複数の文(英文)が一行目に書かれたtxtファイルの特定の文字を別の文字に変換させたいです.
具体的には文頭にある文字,iを大文字にさせたいです.(元のファイルではすべて小文字)
文章の最後は英文なので!や."や.や?で終わるのですが,処理をどうすればいいのでしょうか?

自分で書いたコード

#include <stdio.h>

char uppercase(char a){
    int i = 'A' - 'a';
    return a + i;
}

int main(){
    char *sentence;
    int cnt_i = 0;
    FILE *fp;  // ファイルポインタを宣言
    fp = fopen("sentence.txt", "r");  // ファイルを開く

    while(fscanf(fp, "%s", sentence) != EOF){  // ファイルの読み込み
        fgets(sentence, 10000000, fp);
    }
    fclose(fp);  // ファイルを閉じる

    // ここをどうすればいいのか...

    printf("%s\n", sentence);
}


自分では上のようなコードまでを書きました.

追記

このコード自体にも間違いがあるようなのですが,それも何を直せばいいのかよくわかりません...

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

  1. ファイルを読み出しモードでオープンする
  2. 別のファイル名で書き込みモードでオープン、ファイル作成する
  3. 元ファイルからデータを読み出し、最初の文字を変更して書き込み
  4. 以降、ファイルを読み込んでそのまま書き込む
  5. 双方のファイルをクローズ
  6. 元ファイルを削除するか、ファイル名を変更
  7. 書き込みファイルのファイル名を元ファイルのファイル名に変更

という手順でファイルの変更/変換を行いましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/28 19:33

    その具体的な処理がよくわからないです(レベルが低くてすみません)

    キャンセル

  • 2018/10/28 19:38

    「C言語 ファイル読み込み」とか、「C言語 ファイル書き込み」とかでぐぐると、コードが見つかりますぜ

    キャンセル

0

まず、sentenceは文字のポインタなので、fscanf(fp, "%s", sentence)でこけます。
読み込む領域を確保してそこに読み込むようにしましょう。
また、一行で10000000(10MB) もあるのでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/28 19:32

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

    char uppercase(char a){
    int i = 'A' - 'a';
    return a + i;
    }

    int main(){
    char *sentence;
    char *word;
    int cnt_i = 0;
    FILE *fp; // ファイルポインタを宣言
    fp = fopen("sentence.txt", "r"); // ファイルを開く
    sentence = (char*)malloc(sizeof(sentence));
    word = (char*)malloc(sizeof(word));

    while(fscanf(fp, "%s", word) == EOF){ // ファイルの読み込み
    fgets(word, 10000000, fp);
    sentence[cnt_i] = *word;
    cnt_i ++;
    }
    fclose(fp); // ファイルを閉じる

    // ここをどうすればいいのか...

    printf("%s\n", sentence);
    }
    ```
    このように変更を加えてみました.
    行のは適当に決めました(大は小を兼ねるかと思いましたが,小さい方がいいですか?)

    キャンセル

  • 2018/10/28 19:51 編集

    sizeof(sentence)もsizeof(word)もポインタサイズ(たぶん8バイト)しかないですが?
    一行いくら(最大バイト数)有りますか?
    while(fscanf(fp, "%s", word) == EOF)←で入りますか?と、EOFの間ループするのですか?
    fgets(word, 10000000, fp);で10Mも読み込んでますがいいのですか?
    各関数の仕様を調べた上で使っていますか?
    //
    http://www.c-tipsref.com/reference/stdio/fgets.html を参考にしてみて下さい。

    キャンセル

0

おそらく、Cを学び始めて、初めて自分でプログラムを書いてみたくなったということだと思いますが、入門書をちゃんと読んでそこのサンプルプログラムを理解できるようになれば、これくらいのプログラムはちゃんと書けますので、あせらずに、入門書を最後まで読み通してみてください。
何も見ずに自分でプログラムを書くのはそれからです。

入門書のサンプルプログラムがどうしても理解できないときは、質問してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

Cなど不要。そう、シェル芸ならね!

$ sed -i '1s/^i /I /' sentence.txt

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る