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

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

ただいまの
回答率

91.26%

  • C

    2671questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

c言語でテキストファイルから1行目を読み飛ばして、2行目から構造体に入れる方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 128

rui

score 1

初めまして!
c言語でファイルを読み込んで、読み込んだファイルの一行目のみを読みとばして2行目以降をソースコードにある通りの構造体に入れて出力したいです。

試したことは、
while (fgetc(fp) != "/n") ;
で一行目を読み飛ばそうと思ったのですが、無限ループに入ってしまっているようで上手く1行目をスルーできないです。
何かいい方法はないでしょうか?
何卒よろしくお願いします。

typedef struct student{
    int code;
    char name[100];
    int math;
    int eng;
}Student;

int main(int argc,char *argv[]){
    Student fa[20];
    FILE *fp;
    int i = 0,m;
    char row[20];

    fp = fopen("test.txtのパス","r");


    while (fgetc(fp) != "/n") ;
    while (fscanf(fp,"%d%s%d%d",&fa[i].code,fa[i].name,&fa[i].math,&fa[i].eng) != EOF) {

        if (fscanf(fp,"%d%s%d%d",&fa[i].code,fa[i].name,&fa[i].math,&fa[i].eng) == 4) {
            printf("番号%d番%sの数学は%d点で,英語は%d点.",fa[i].code,fa[i].name,fa[i].math,fa[i].eng);
        }
        i ++;
    }

    fclose(fp);


}

test.txt
```
20  
001       Alice             58        58
002       Bob              100        54
003       Charlie           60        51
004       Carol             74        54
005       Dave              49        32
006       Eve               54        41
007       Frank             73        64
008       Grace             95        54
009       Heidi             46        41
010       Judy              50        66
011       Mallory           57        45
012       Olivia            67        55
013       Oscar             60        73
014       Peggy             73        57
015       Steve             87        34
016       Ted               64        46
017       Victor            49        51
018       Walter            49        54
019       Wendy             22        69
020       Zoe               41        66

補足情報(言語/FW/ツール等のバージョンなど)

xcode8.2.1使ってます

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • A.Ichi

    2017/12/12 05:37

    ダブルでなくシングル?

    キャンセル

  • rui

    2017/12/12 10:21

    回答ありがとうございます、文字自体との比較はシングルなのですね! 勉強になりました。

    キャンセル

回答 3

+2

while (fgetc(fp) != "/n") ;

を単純にデバッグして

while (fgetc(fp) != '\n') ;


としただけだと、入力が改行文字を含んでいない(たとえば空ファイル)のときに無限ループになります。対応するならたとえばこう。

while (fgetc(fp) != '\n' && !feof(fp))  ;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/15 17:38

    空のファイルのこと考えていませんでした、、、
    ありがとうございます。

    キャンセル

checkベストアンサー

+1

/nじゃなくて\nでは?

追記

こちらのコードで動作確認できました。Wandbox
追加した関数は表記を簡単にする目的しかありませんので、適宜読み捨ててください。

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

typedef struct {
    int code;
    char name[100];
    int math;
    int eng;
} Student;

int fscan_student(FILE *fp, Student *dst) {
    return fscanf(
        fp, "%d%s%d%d\n",
        &dst->code, dst->name, &dst->math, &dst->eng
    );
}
int fprint_student(FILE *fp, const Student *src) {
    return fprintf(
        fp, "番号%d番%sの数学は%d点で,英語は%d点.\n",
        src->code, src->name, src->math, src->eng
    );
}

int main(void) {
    FILE *fp = fopen("test.txt", "r");
    if(fp == NULL) {
        return EXIT_FAILURE;
    }

    Student students[20];

    while(fgetc(fp) != '\n');
    for(int i = 0; fscan_student(fp, &students[i]) != EOF; ++i) {
        fprint_student(stdout, &students[i]);
    }

    fclose(fp);
    return EXIT_SUCCESS;
}

cateyeさんがご指摘されている点に加えて、fgetcの戻り値の扱いに誤りがありました。

while (fgetc(fp) != "/n") ;

このままでは、fgetcの戻り値と比較しているのは文字列のアドレスです。
文字自体と比較するためには、シングルクオーテーションで括る必要があります。

while(fgetc(fp) != '\n');

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/12 04:34

    回答ありがとうございます。
    あ、ほんとですね笑
    バックスラッシュに直してみたのですが、未だに無限ループ抜けれないです、、、、

    キャンセル

  • 2017/12/12 10:25

    ソースまで載せていただきありがとうございます。
    おかげ様で動きました。

    ソースまで載せていただいたのでベストアンサーにさせていただきます。

    キャンセル

+1

ちょっと見ですが・・・おかしいところd^^
fp = fopen("test.txtのパス","r");
・・ちゃんとオープンできていますか?

while (fscanf(fp,"%d%s%d%d",&fa[i].code,fa[i].name,&fa[i].math,&fa[i].eng) != EOF) {

if (fscanf(fp,"%d%s%d%d",&fa[i].code,fa[i].name,&fa[i].math,&fa[i].eng) == 4){

一回のループでfscanf()を2度呼んでる・・・

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/12 10:23

    回答ありがとうございます。
    fopenはちゃんとできています。
    確かに、fscanf2回呼び出すって意味わからないですよね、、、、
    ありがとうございます

    キャンセル

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

ただいまの回答率

91.26%

関連した質問

  • 解決済

    パイプとc言語

    前提・実現したいこと dateからパイプして、日付を他言語でターミナルに表示できるようにしたいです。フランス語とドイツ語で曜日と月が書いてあるファイルが存在しています(fr.tx

  • 解決済

    構造体のプログラム

    いつもお世話になっています。C言語初心者でただいま勉強中です。構造体について質問させていただきます。ファイルから構造体配列に読み込んで以下のように出力するプログラムを作りたいんです

  • 解決済

    準備された入力ファイルをもとに、合計、平均、偏差値を表示(合計点降順)させたプログラム作成

    レポート課題でわからない問題があります。 問題:入力ファイルmotofile.datを事前に用意し、出力ファイルresult.datを生成するC言語ソースプログラムファイルhen

  • 受付中

    構造体の保存(ファイル、読み込み、書き込み、配列)

    前提・実現したいこと EclipseでC/C++言語を学んでいます。大学の課題でこんなものが出ました。 typedef struct student{ char nam

  • 解決済

    c言語 リスト構造の検索

    アドレス帳の検索機能だけのプログラムを作っています。 作りたいプログラムは、  1,検索したい人の名前を入力する  2,事前に登録された情報の中から部分一致検索する 

  • 解決済

    既存のファイルを複数の指定の行数で分割保存する方法はありますか?

    前提・実現したいこと 膨大なデータ(excelで開けません)を指定の行で分割保存したいです。 その時、例えば、合計10000行のデータを、 1~1000行で1ファイル(1000行)

  • 受付中

    リスト構造と待ち行列

    リスト構造と待ち行列をしたいのですが、よくわかりません。 おすすめのサイトや説明おねがいします。 #include <stdio.h> #include <stdlib.h>

  • 解決済

    C言語 ファイルからの読み取り

    大学の授業の課題で以下のような問題が出たのですが分かりません。C言語です。 ファイルから読み取る関数と出力する関数を分けたいです。 null 文字を除いて最大20文字を格納でき

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

  • C

    2671questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • トップ
  • Cに関する質問
  • c言語でテキストファイルから1行目を読み飛ばして、2行目から構造体に入れる方法