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

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

新規登録して質問してみよう
ただいま回答率
85.83%
C

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

Q&A

解決済

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

rui
rui

総合スコア7

C

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

3回答

0グッド

0クリップ

29866閲覧

投稿2017/12/11 18:38

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

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

c

1typedef struct student{ 2 int code; 3 char name[100]; 4 int math; 5 int eng; 6}Student; 7 8int main(int argc,char *argv[]){ 9 Student fa[20]; 10 FILE *fp; 11 int i = 0,m; 12 char row[20]; 13 14 fp = fopen("test.txtのパス","r"); 15 16 17 while (fgetc(fp) != "/n") ; 18 while (fscanf(fp,"%d%s%d%d",&fa[i].code,fa[i].name,&fa[i].math,&fa[i].eng) != EOF) { 19 20 if (fscanf(fp,"%d%s%d%d",&fa[i].code,fa[i].name,&fa[i].math,&fa[i].eng) == 4) { 21 printf("番号%d番%sの数学は%d点で,英語は%d点.",fa[i].code,fa[i].name,fa[i].math,fa[i].eng); 22 } 23 i ++; 24 } 25 26 fclose(fp); 27 28 29} 30

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使ってます

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

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

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

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

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

A.Ichi

2017/12/11 20:37

ダブルでなくシングル?
rui

2017/12/12 01:21

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

回答3

2

while (fgetc(fp) != "/n") ; ```を単純にデバッグして ```ここに言語を入力 while (fgetc(fp) != '\n') ;

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

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

投稿2017/12/14 15:40

a_saitoh

総合スコア695

LouiS0616, rui👍を押しています

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

rui

2017/12/15 08:38

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

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/11 20:05

cateye

総合スコア6849

rui👍を押しています

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

rui

2017/12/12 01:23

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

1

ベストアンサー

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

追記

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

C

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct { 5 int code; 6 char name[100]; 7 int math; 8 int eng; 9} Student; 10 11int fscan_student(FILE *fp, Student *dst) { 12 return fscanf( 13 fp, "%d%s%d%d\n", 14 &dst->code, dst->name, &dst->math, &dst->eng 15 ); 16} 17int fprint_student(FILE *fp, const Student *src) { 18 return fprintf( 19 fp, "番号%d番%sの数学は%d点で,英語は%d点.\n", 20 src->code, src->name, src->math, src->eng 21 ); 22} 23 24int main(void) { 25 FILE *fp = fopen("test.txt", "r"); 26 if(fp == NULL) { 27 return EXIT_FAILURE; 28 } 29 30 Student students[20]; 31 32 while(fgetc(fp) != '\n'); 33 for(int i = 0; fscan_student(fp, &students[i]) != EOF; ++i) { 34 fprint_student(stdout, &students[i]); 35 } 36 37 fclose(fp); 38 return EXIT_SUCCESS; 39}

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

C

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

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

C

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

投稿2017/12/11 18:48

編集2017/12/11 23:44
LouiS0616

総合スコア35634

rui👍を押しています

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

rui

2017/12/11 19:34

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

2017/12/12 01:25

ソースまで載せていただきありがとうございます。 おかげ様で動きました。 ソースまで載せていただいたのでベストアンサーにさせていただきます。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.83%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

C

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