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

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

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

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

ファイル

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

解決済

fgetsとmemcpyのやり方

kekennnn
kekennnn

総合スコア1

C

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

ファイル

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

2回答

0リアクション

0クリップ

434閲覧

投稿2022/07/23 23:04

編集2022/07/24 05:45

fgets関数を用いて、ファイル(class.dat)を1行ずつ読み込み、memcpyで切り取りをし、生徒の成績を作りたいと考えています。
ファイル(class.dat)の内容は左から、クラス(全角2桁)、氏名(全角20桁)、性別(全角MまたはFの1桁)、国語の点数(半角3桁)、数学の点数(半角3桁)、英語の点数(半角3桁)となっています。また、性別は男・女と表示したいと考えてます。

現在、ファイルの読み込みはできたのですが、memcpyの部分が上手く出来ないです。
C言語初心者なので、考え方が浮かばないので、教えていただけますと幸いです。

txt

JM田中 なおき M026052036 JM渡辺よしひこ M056011023 JM吉田 なおみ F078002014 JM高橋 啓介 M095100033 JM武田 謙信 M020025003 RM大阪 ヒロキ M069078056 RM太田 信彦 M033069074 RM吉田 さおり F025085012 KM守屋 かおり F036075074 KM佐藤 かよ F014026085 KM川崎 たかや M025047091 KM野原 ひろし M098036062

表示したい結果============================
クラス  氏名     性別  国語  数学  英語  合計 
JM    田中 なおき 男   026  052  036   114
・・・・・省略・・・・・

===================================

C

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { FILE* fp; char str[256]; char class[4]; char name[64]; char gen[2]; char Tensu[16]; int tensu; int jap; nt math; int eng; printf("クラス\t氏名\t\t性別\t国語\t数学\t英語\t合計\t\n"); printf("------------------------------------------------------------\n"); fp = fopen("class.dat", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } while (!feof(fp)) { if (fgets(str, 256, fp) == NULL) { break; } memcpy(&class, str, 2); memcpy(&name, str[2], 20); memcpy(&gen, str[22], 1); memcpy(&Tensu, str[23], 9); tensu = atoi(Tensu); memcpy(&jap, Tensu[3], 3); memcpy(&math, Tensu[6], 3); memcpy(&eng, Tensu[9],3); printf("%s\t %s\t\t %s\t %s\n ", &class, &name, &gen, &jap, &math &eng &jap + &math + &eng ); } fclose(fp); return 0; }

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

y_waiwai

2022/07/23 23:06

うまくいかない、とはどういう動作となるんでしょうか。詳しく説明しよう また、実際にはどういう表示になるのかってのも提示しよう
kekennnn

2022/07/23 23:13

printf("クラス\t氏名\t\t性別\t国語\t数学\t英語\t合計\t\n"); printf("------------------------------------------------------------\n"); この部分の表示はできています。 また、memcpy(&gen, str[22], 1);の部分で『0x00007FF900241416 (vcruntime140d.dll) で例外がスローされました (test.exe 内): 0xC0000005: 場所 0x00000000FFFFFFE7 の読み取り中にアクセス違反が発生しました』という表示が出てきており、調べたのですが、よくわかりませんでした、
archiver

2022/07/24 00:03

氏名データですが、「渡辺よしひこ」だけ姓と名の間にスペースが無く、他はスペースがありますが、姓と名の間にスペースを入れる入れないは何かルールはありますか? またデータに全角文字(マルチバイト文字)を使用していますが、文字コードは何を想定していますか?文字コードによっては全角文字(マルチバイト文字)を表すバイト数が変わりますので、今の単に「文字数」指定のmemcpyでは期待通りのコピーにならないと思います。
kekennnn

2022/07/24 00:14

氏名データですが、「渡辺よしひこ」ですが、ファイルを渡された時点でこの状態であったので、特にルールはないと思います。 文字コードについても指示がない状況です。
archiver

2022/07/24 00:48

これって委託業務か何かですか?データファイルについては仕様を確認された方がいいです。 1レコード(1行)のデータに可変長データ(氏名)と固定長データ(氏名以外)が混在しています。今の形式では氏名データ(以降)を抜き出すのがかなり困難になります。
kekennnn

2022/07/24 01:55

学校の課題です。  クラス(全角2桁)、氏名(空白全角20桁)、性別(全角MまたはFの1桁)、国語の点数(半角3桁)、数学の点数(半角3桁)、英語の点数(半角3桁)で固定長と言われました。
kazuma-s

2022/07/24 02:08

質問の class.dat の内容を ```text と ``` で挟んでください。 ソースコードも main の中身だけを ``` と ``` で挟むのではなく、 #define ... から } までの全部を ```C と ``` で挟んでください。 質問は編集できます。
kazuma-s

2022/07/24 02:14

> クラス(全角2桁)、氏名(空白全角20桁)、性別(全角MまたはFの1桁)、 質問の class.dat の内容では、クラスも性別も半角になっていますが、違うんですか?

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C

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

ファイル

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