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

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

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

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

Q&A

解決済

3回答

33007閲覧

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

rui

総合スコア7

C

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

0グッド

0クリップ

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A.Ichi

2017/12/11 20:37

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

2017/12/12 01:21

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

回答3

0

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

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

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

投稿2017/12/14 15:40

a_saitoh

総合スコア702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rui

2017/12/15 08:38

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

0

ちょっと見ですが・・・おかしいところ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

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rui

2017/12/12 01:23

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

0

ベストアンサー

/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

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rui

2017/12/11 19:34

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

2017/12/12 01:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問