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

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

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

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

Q&A

2回答

944閲覧

C言語でファイルを1行ずつ読み込み配列に格納したい

YuYH

総合スコア1

C

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

0グッド

0クリップ

投稿2023/07/07 00:58

実現したいこと

読み込んだファイルに含まれる情報を1行ずつ読み込み、配列に文字列データとして格納したい。

前提

C言語初学者です。普段はPythonで開発しています。
都合によりC言語で開発を行うことになったのですが、Pythonとは感覚が大きく異なっているのでご助力願いたいです。

読み込み対象のテキストには、1行ずつに必要な文字列情報が格納されています(スペース、カンマの文字が含まれています、1行の長さは一定ではないです)

例) 1, 5, 50, 15, 9, ......\n
5, 10, 9, 15, 20, 11.5, .....\n

この後の処理では、この1行に示されている情報に対してのみ1回処理を行うため、この文字列情報を1まとめにして配列に格納したいです。
型の宣言で詰まったり、for文で回しても1行しか読まなかったり、全く配列に格納されない等で引っかかっています。

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5#define N 50 //読み込み行数の上限 6#define size 512 //最大読み込み文字数 7 8vaid main(){ 9 10File *fp; 11errno_t error; 12 13error = fopen_s(&fp, "text.txt", "r"); 14 15if(error != 0){ 16 printf("ファイルを開けません\n"); 17}else{ 18 char line[size]; 19 char txtArr[N]; 20 21 for (int i =0; i < N; i++){ 22 strcpy_s(txtArr[i], size, fgets(line, size, fp)); 23 } 24} 25fclose(fp); 26return; 27}

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

コンパイラの都合上strcpy()ではなくstrcpy_s()を使用するようにしています。他の関数についても同様です。

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

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

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

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

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

guest

回答2

0

c には「文字列」というものはありません。
文字列は「文字の配列」であり、それが char line[size]; といった宣言に現れています。
おそらく txtArr は「文字列の配列」のつもりと思いますが、 char txtArr[N]; という宣言は line と全く変わらず、「文字の配列」として宣言されています。
また、 strcpy( 及び strcpy_s) の第一引数は文字列へのアドレスのはずです。char txtArr[N]; の時の txtArr[i] は「 i 番目の文字」を表す書き方であり、それをアドレスとして渡すのは最悪システムを壊す行為です。
ファイルから 1 行最大 size(-1) 文字で最大 N 行読み込んで保持するのであれば、

c

1 char txtArr[N][size]; //文字の2次元配列=文字列の1次元配列 2 for(int i=0; i<N && fgets(txtArr[i],size,fp)!=NULL; i++); //この場合の txtArr[i] は i 番目の「文字の配列(=文字列)」のアドレス

といった書き方が必要になります。

投稿2023/07/07 01:16

編集2023/07/07 01:19
jimbe

総合スコア13318

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

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

0

char txtArr[N}だと(最大49文字の)1個の文字列しか格納できません。
やりたいことに合わせるならchar txtArr[N}[size]というN行×size分の2次元配列を利用すべきです。
あと、C言語の教科書でひととおり勉強することを強くお勧めします。

投稿2023/07/07 01:09

can110

総合スコア38352

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問