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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Q&A

2回答

1009閲覧

構造体を用いてファイルの中身を表示させるプログラムを作成したいです.

RyoBaya

総合スコア1

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

0グッド

0クリップ

投稿2021/07/28 04:37

編集2022/01/12 10:55

前提・実現したいこと

txtファイルの数値を表示させるプログラムを作成しています.
エラーがなくなり実行したところ数値がバグって表示されてしまいます.
汚いプログラムかと思いますがご回答よろしくお願いいたします.

使用しているtxtファイルの中身です.
(74476574bf0ef84b87eb2013d5585b3e.png)

発生している問題・エラーメッセージ

./NSP [~/Desktop/NRP] zsh: segmentation fault ./NSP

該当のソースコード

c

1#include<stdio.h> 2#include<stdlib.h> 3 4#define MAX_STAFF 8 5 6typedef struct{ 7 char ID;//従業員ID 8 int MaxShifts;//作成する稼働表の日数.ここでは14日 9 int MaxTotalMinutes;//1日の最大労働時間(単位:分) 10 int MinTotalMinutes;//1日の最小労働時間(単位:分) 11 int MaxConsecutiveShifts;//最大の連勤回数 12 int MinConsecutiveShifts;//最小の連勤回数 13 int MinConsecutiveDaysOff;//最小の連続した休日 14 int MaxWeekends;//週末は一週間で一回しか来ない. 15}employee_time_info; 16 17int main(){ 18 int i,mt; 19 int m,n,o,p,q,r,s,t; //ファイルの受け取り 20 FILE *fp; 21 employee_time_info staff[MAX_STAFF];//構造体の宣言 22 23 if((fp=fopen("staff_info.txt","r"))==NULL){ 24 printf("ファイルが開けません\n"); 25 exit(1); 26 } 27 for(i=0;i<MAX_STAFF;i++){ 28 if(fscanf(fp," %s ,%d ,%d ,%d ,%d ,%d ,%d ,%d\n",staff[i].ID,&staff[i].MaxShifts,staff[i].MaxTotalMinutes,staff[i].MinTotalMinutes,&staff[i].MaxConsecutiveShifts,&staff[i].MinConsecutiveShifts,&staff[i].MinConsecutiveDaysOff,&staff[i].MaxWeekends)!=8)break; 29 } 30 fclose(fp); 31 32 /* for(i=0;i<MAX_STAFF;i++){ 33 printf(" 従業員:%s \n1日の最大労働時間: %d分\n 1日の最小労働時間: %d分\n 最大の連勤回数: %d回\n 最小の連勤回数 %d回\n",staff[i].ID,staff[i].MaxShifts,staff[i].MaxTotalMinutes,staff[i].MinConsecutiveShifts,staff[i].MinConsecutiveShifts); 34 }*/ 35 36 for(i=0;i<MAX_STAFF;i++){ 37 printf("従業員: %s\n",staff[i].ID); 38 printf("1日の最大労働時間: %d\n",staff[i].MaxShifts); 39 printf("1日の最小労働時間: %d分\n",staff[i].MinConsecutiveShifts); 40 printf("最大の連勤回数: %d回\n ", staff[i].MaxConsecutiveShifts); 41 printf("最小の連勤回数: %d回\n",staff[i].MinConsecutiveShifts); 42 } 43 44 return 0; 45} 46

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

Macのemacsを使用しています.コンパイラはgccです.

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

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

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

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

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

jimbe

2021/07/28 05:09

タイトルには、ご質問の内容の主旨をお書きください。
dodox86

2021/07/28 07:35

[2021/07/28 16:26]の質問内容の編集を読んで: teratailは技術的な質問に対して回答を得ようとするQ&Aサイトであって、要望を書けば添削やコードの提供をしてもらえる場所ではありません。(そうでないと、希望のプログラムの完成までずっと付き合うことになりますよね)
RyoBaya

2021/07/28 07:49

dodox86さん,申し訳ありませんでした.焦っていた為,文章が抜けてしまい大変失礼になってしまいました.
guest

回答2

0

char ID;//従業員ID

なので、書式は%sじゃなくて%cです。
あと、fscanf&がいくつか抜けてます。見にくいので、適宜改行すると良いです。

また、fscanfループでbreakしたときのiの値が読み込んだ件数なので、
出力するときは、その件数までの出力にしないと、以降はゴミデータが出力されます。

投稿2021/07/28 08:47

編集2021/07/28 08:48
otn

総合スコア84423

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

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

0

fscanf(fp,"%s %d %d %d %d %d %d %d\n",...

カンマ区切りで読んでいない。

投稿2021/07/28 04:40

episteme

総合スコア16614

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

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

RyoBaya

2021/07/28 04:51

カンマ区切りで読むのはどうすればよろしいですか.
episteme

2021/07/28 06:38

scanfに与える書式指定でどうにかできそうだけど、僕はstrtokでやるのが好み。 #include <stdio.h> #include <string.h> int main() { char line[64] = "A,14,4320,3360,5,2,2,1"; for ( char* token = strtok(line, ",\n"); token; token = strtok(NULL,",\n") ) { printf("[%s]\n", token); } return 0; }
episteme

2021/07/28 07:00

あと、IDを格納する領域を確保していない。
RyoBaya

2021/07/28 07:27

すみません.表示させたい表現が間違っていることに気づきました. ソースコード変更したのでよろしくお願いいたします.
episteme

2021/07/28 07:30

なにをお願いしているのでしょうか。質問には答えたつもりなんですが。
episteme

2021/07/28 07:31

え? char* ID じゃなく char ID なの? だったら 書式 %s は明らかにマチガイちゃいます?
RyoBaya

2021/07/28 07:48

申し訳ありません.charに関しては脱字でした. 表示させたいように表示できないので困っています. 従業員:A 1日の最大労働時間 4320分 1日の最小労働時間 3360分 最大の連勤回数 5回 最小の連勤回数 2回 以下,従業員B,従業員C... というのを表現したく再度質問させてください.
episteme

2021/07/28 07:50

strtokを使ってカンマ区切りで分割するコードを示しました。それでは不満ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問