ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語コミュの[質問]テキストファイルから1行ずつ読み

  • mixiチェック
  • このエントリーをはてなブックマークに追加
テキストファイルから1行ずつ読み取って、
それを英字数字をひとまとめとしてひとつの配列に格納したいのですが。。。

例えばexample.txtというテキストファイルの中身が
G01X000Y000D02
G02X5000Y2000D01
G54D03
:
:
だとすると、これを
G01
でひとつの配列に格納して
X000
でまたひとつの配列に格納していきたいのですが。。

自分で作ってみたのがこちらです。

# include <math.h>
# include <stdio.h>

FILE *fp0;

char str[256];
char a[10][10];

void main ( )
{
int i,j,k,slen;
char str_[10][10];

if((fp0 = fopen(example.txt,"r")) == NULL){
printf(stderr,"No such file or directory.\n");
exit(1);
}

while (fgets(str, 256, fp0) != NULL){
i=j=k=0;
slen=strlen(str);

a[0][0]=str[0];
for(i=1; i<slen; i++){
if(isalpha(str[i]) == 0){
a[j][k+1]=str[i];
k++;
}else if(isalpha(str[i]) == 1){
j++;
k=0;
a[j][k]=str[i];
}
}

fclose(fp0);

}

まだプログラミング初心者なのでいろいろ指摘して下さい。

コメント(21)

タイトルは勝手に変えさせていただきました。
------------------------------------------------
トピックスのタイトルは、投稿内容に対しての要約と差別化を計ってください。

「☆質問☆」などいった類にものが乱立すると
何が何だかわからなくなります。

それぐらいの事は予想し、
また他のトピのタイトルを参考にするくらいは
Mixiに入る資格のある年齢ならば察していただかないと困ります。
申し訳ありませんでした。。
今後気をつけたいと思います。
> 2
謝罪の仕方が30点です。

まず自らの過ちを認めることをしないと
他人はそれを認めてくれません。

たとえば、
「自分のことばかり考えており
 他人への気遣いを忘れておりました」

などと付け加えると
相手も納得してくれます。
void main ( )

main関数はint型を返します。
Cでは関数の引数を()で省略できません。
何も引数を取らないときはvoidを書いてください。

あとmain と ()に隙間を書く人はあまりいないので
多数の人が見難いと感じます。
if ((fp0 = fopen(example.txt,"r")) == NULL){
中の
example.txt
は恐らく
"example.txt"
したかったものと思われますが
間違っています。
example.txt
しまうと構造体です。
> 例えばexample.txtというテキストファイルの中身が
> G01X000Y000D02
> G02X5000Y2000D01
> G54D03

特定のフォーマットの話をするのであれば
それを提示しないとお話になりません。
つまり「例えば」なんていうのはつけず
何を読み込ませたいのかはっきりと示してください。
> for(i=1; i<slen; i++){

Cでは配列の要素は0から始ります。
while (fgets(str, 256, fp0) != NULL){

ここから始るブロック({…})の終わりの括弧(})が見当たりません。
> printf(stderr,"No such file or directory.\n");

fprintf(stderr,"No such file or directory.\n");
または
printf(No such file or directory.\n");
と書くべきです。
> exit(1)

exit()関数を使用する場合は
#include <stdlib.h>
をインクルードしてください。
> slen = strlen(str);

strlen()関数を使用する場合は
#include <string.h>
をインクルードしてください。
> if(isalpha(str[i]) == 0){

isalpha()関数を使用する場合は
#include <ctype.h>
をインクルードしてください。
> char str_[10][10];

使用しない(しなくなった)変数はコード上に残さないでください。
i=j=k=0;

iの初期化は無駄です。
その後for文内で更に初期化しています。
> G01
> でひとつの配列に格納して

ひとつの配列という言葉の意味が分かりません。
よって何がしたいのかわかりません。
>7
str[0]はfor文の中で処理しないためにfor文の外に出しているのでfor文は1から始めました。

>14
7の理由によりiも初期化for文の外で初期化しています。

色々指摘してくださりありがとうございます。
現時点で修正したものを載せたいと思います。

# include <math.h>
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <ctype.h>

FILE *fp0;

char str[256];
char a[10][10];

void main(void)
{
int i,j,k,slen;

if((fp0 = fopen("example.txt","r")) == NULL){
printf("No such file or directory.\n");
exit(1);
}

while (fgets(str, 256, fp0) != NULL){
i=j=k=0;
n=1;
slen=strlen(str);

str_[j][k]=str[i];
for(i=1; i<slen; i++){
if(isalpha(str[i]) == 0){
a[j][k+1]=str[i];
k++;
}else if(isalpha(str[i]) == 1){
j++;
k=0;
a[j][k]=str[i];
}
}
}
fclose(fp0);

}
>15
fgetsでファイルから取得した文字列をG01,X000という風に
分割したいんですよ。
> 17
ルールを明確にしてください。
どういう風に分割するのかルールを!かけ!
> str[0]はfor文の中で処理しないために
> for文の外に出しているのでfor文は1から始めました。

マジックナンバーを消してください。
意味が分からないのならネットで調べるか本でも読んでください。
> str[0]はfor文の中で処理しないために

そもそも何故forの中で処理をしない?
  while (fgets(str, sizeof(size), fp0) != NULL) {
    k = 0;
    for (i = 0; str[i] != '\n' && str[i] != '\0' ; i++) {
      a[j][k++] = str[i];
      if (str[i + 1] == '\n' || str[i + 1] == '\0' || isalpha(str[i + 1])) {
        a[j++][k] = '\0';
        k = 0;
      }
    }
  }

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語 更新情報

C言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。