◎プログラム仕様

C言語を使用

入力ファイルから1レコードを入力する。改行マークまで入力する。
2番目の「:」以前のデータを有効とする。
2番目の「:」からは、不要です。
出力ファイルへ出力する。
この処理を最終レコードまで行う。

処理の例
yoneko:ksgtgsmbnisysbnka:sjkmakshs7s:sksksk99jjs: 入力データ
yoneko:ksgtgsmbnisysbnka                出力データ

入力ファイル名・出力ファイル名は、任意に指定できるものとする。
入力ファイルの1レコード当たりの最大バイト数は、100バイトします。
それぞれの処理でエラーが発生した場合は、エラーの表示を行う。


を依頼されました。
まったく意味が分りません。
わかりやすく説明していたでけないでしょうか。
C言語、自体わかりません。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

みっともない英文を書いたので、そのお詫びがてら、コメントを。




#include <string.h>
#include <stdio.h>

int main()
{
  char buf[1024];  /* 大き目に読込バッファをとっておく */
  buf[101] = -99;  /* 超えてはいけないところに、ASCII文字以外のコードを埋めておく(番人) */

  while (gets(buf)) /* 標準入力から一行読み込んで EOF かエラーを返すまで */
  {
    char* p;
    if (buf[101] != -99) /* 番人として埋めたコードが置き換わっていたら、1レコードの制限を越えたと判断 */
    {
      fprintf(stderr, "input record maybe exceeds the limits (100 bytes).\n");
      exit(1);
    }

    if (p = strchr(buf, ':'))  /* 最初に出てくる ':' の位置を p に入れる */
    {
      p = strchr(p + 1, ':'); /* 最初の ':' の次の位置から ':' を(つまり二個目)探す */
      if (p)      /* 二個目の ':' があれば */
        *p = '\0';  /* そこを文字列の終端にする */
      /* 二個目の ':' が無ければ、入力レコードはそのまま */
    }
    /* 一個目の ':' が無ければ、入力レコードはそのまま */

    puts(buf);       /* 二個目の ':' 以降をちょん切った文字列を標準出力に書き込み */
    if (ferror(stdout))  /* 一応、書き込みエラーのチェック */
    {
      fprintf(stderr, "write error\n");
      exit(1);
    }
  }
  if (ferror(stdin))  /* 一応、gets() のエラーチェック */
  {
    fprintf(stderr, "read error\n");
    exit(1);
  }
  return 0;
}

後、マニュアルを読めば分かることですが、strchr() は、一つ目の引数で
示される位置から、二つ目の引数で示される文字を探す関数です。
もし、文字が見つかればその位置を、見つからなければ NULL を返します。

省略した書き方をしていますが、

  if (p = strchr(buf, ':'))

は、

  if ((p = strchr(buf, ':')) != NULL)

もっと(他の言語を知っているとして)わかりやすく書けば

  char* pos;
  pos = p = strchr(buf, ':');
  if (pos != NULL)

です。


後、いんちき英語についても弁解をしておこう。

「日本語の方がわかりやすい」ということについては、ametsuchi さんの
いう通り。

ただ、いんちきでも良いから、なるべく英語を近くにおいておく習慣を
つけておいた方が良いです。

日本語が表示できない環境はほとんど無いと言っても良いが、日本語を
入力できない環境はままあったりするし、なにしろ最新の情報は、まず
英語圏から発信されることが多い。

また、日本語のマニュアルの意味が良く分からないなあ、と思ったら、
テクニカルタームを良く知らない人が和訳をしているだけで、英語の
マニュアルでは意味が一目瞭然だったり。


なるべく書くようにしておけば、間違っていても、指摘をしてくれる人も
居るわけで (^^;
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
標準入出力とリダイレクトについて勉強中です。

お礼日時:2001/03/29 17:01

a-kumaさんの回答素晴らしいのだけれど、英文のメッセージおかしくないですか?



私の英語力もメチャひどいのだけれど...

1)Excess:名詞です。ここに名詞がくるのはおかしいのでは?動詞であるExceeds(3人称単数、現在)、またはExceed?因みに昔読んだ米国人の書いたソースコード(=Fortran)では「Exceeds the limit」というような表現だったと思う。

2)byte--->bytes?(複数形)

私もFortran時代は、無理してインチキ英語でコメントやらメッセージを書いていたが、最近は日本語。日本人が読むのであればそれが一番です。書く方も楽。

madaraさんにも、それをオススメします。
    • good
    • 0

「答えて」系のサイトに書き込むのだから、他の方のように


質問者の背景や質問の理由は敢えて問いません。

素直じゃないところが何ヶ所かあるので、学校の課題だと
突っ込まれるところがあるかも。せめて、マニュアル程度を
引いて、意味を調べておくことをすすめます。

もし、仕事なら、それが研修の課題であろうと、実務であろ
うと、意味が分かってないと、将来苦労するでしょうから
やっぱり、少しは調べておいた方が良いでしょうね。



#include <string.h>
#include <stdio.h>

int main()
{
  char buf[1024];
  buf[101] = -99;
  while (gets(buf))
  {
    char* p;
    if (buf[101] != -99)
    {
      fprintf(stderr, "input record maybe excess 100 byte.\n");
      exit(1);
    }
    if (p = strchr(buf, ':'))
    {
      p = strchr(p + 1, ':');
      if (p)
        *p = '\0';
    }
    puts(buf);
    if (ferror(stdout))
    {
      fprintf(stderr, "write error\n");
      exit(1);
    }
  }
  if (ferror(stdin))
  {
    fprintf(stderr, "read error\n");
    exit(1);
  }
  return 0;
}


ファイルの指定は、標準入出力を使っているので、リダイレクト
で指定してね。


# 「わかりやすく説明」という意味では、落第点の回答ですね
    • good
    • 0
この回答へのお礼

回答してくださってありがとうございます。
このプログラムがどういう意味なのかが分らないので
a-kumaさんのすばらしさがわからないのが残念です。
ただいま少しずつ勉強中です。

お礼日時:2001/03/21 09:47

皆さんも言っておられるとおり仕事で来ているなら変ですね。

断るしかないでしょう。

実際のところ、学校の課題かなにかように見えるのですが・・・
答え自体は簡単ですが、勉強している人ならなおの事、お答えしかねます。(つめたいようですが・・・)
    • good
    • 0

こんにちは。


依頼された・・ということは、お仕事なのですか?

C言語が解らなくて、このプログラム仕様がまったく意味がわからないのであれば、
無理でしょう。
説明しても、理解はできないのではないでしょうか?
もし、ここでコーディング例を書いて、それでお仕事をこなしたとしても、
お仕事であればメンテナンスも発生してくるでしょうし。。
理解できていないとメンテもできませんよね?

どういう経緯で依頼がきたのか解りませんが・・。

他の言語でプログラミングはできますか?
それともプログラミング自体がわからない??
madaraさんの知識の範囲がわかりませんので、なんとも・・・。
    • good
    • 0

C言語がわからないと、さっぱりだと思いますよ。


多分、基礎知識がないとどんな説明をしても
出来ないと思います。
何故こんな仕事が来たのかも疑問ですし。
これはもともとプログラマがするようなことですし。
(それほど難しくないけど)

ファイル入出力があるので、
ド素人では不可能です。
    • good
    • 0

C言語がまったくわからない人に、何故こういう依頼が来たのでしょうか?


まずはここが疑問です。仕事ならなおさらです。

これくらいのプログラムなら、わかる人には30分もあれば作れると
思うのですが、これが仕事ならお金をもらわないと割りが合いません。

C言語をまったくわからない人に、わかりやすく説明するのは難しいと思います。
ちなみにどういう言語はOKなんですか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QpgmファイルをC言語で読込、処理、出力する方法

題名の通りのプログラムを作成しています。
http://www.mm2d.net/c/c-07.shtml
http://www.mm2d.net/c/c-09.shtml
http://www.mm2d.net/c/c-10.shtml
を参考に、コンパイルが通るプログラムは作りました。
あとは何らかの画像処理を行い、printfをどこかに埋め込んだら完成だと思うのですが、
画像処理とprintfを行う(埋め込む)場所が分かりません。
教えてください。

環境はwindowsです。UNIXじゃないのでバイナリモード(r→rb、w→wb)にしなければいけないかもです。

Aベストアンサー

前の質問で元の内容に対しての内容から話が広がっていくのでわざと静観していましたが
再度別質問立てたようなので改めて反応

>コンパイルが通るプログラムは作りました。
作ってないよね あなたは書いてあるものをコピーしただけ

ざっと見ただけですがそこのHP記載のコードで既に読込・出力処理は実装されています
動かないのはあなたがその関数を使って無いからです

実際扱うファイル名の入出力(指定)処理は あなたが別途処理を書いたうえで
コピーした関数軍に適切なパラメータを受け渡してやる必要があります
実際行いたい処理はあなた自身が作成する必要があります

質問と行動見てると正直  あなたのレベルがそのレベルに達していない感  がします
もっと基本的な勉強をすることをお勧めします

QC言語のファイル処理 C言語

指定したファイルのなかの文字列を表示させたいです。
最後の2行だけ表示させたいのですが、どうやっていいのかわかりません。。。また、それ2行を、入力した出力ファイルに書き込みたいのですが・・、どうやって指定したらいいのでしょうか??
わかる方よろしくです(><)

Aベストアンサー

>最後の2行だけ表示させたいのですが
2行文のバッファを用意し、ファイルを一行ずつ読みバッファの内容を更新していけば良いのでは?

なんとなくなフロー
char buffer[],last[],last2[];
FILE *fp;
fp = fopen(・・・)
while(fgets(buffer, sizeof(buffer), fp) != NULL){
strcpy(last2, last);
strcpy(last, buffer);
}
printf("%s\n%s\n", last2, last);

>また、それ2行を、入力した出力ファイルに書き込みたいのですが・・
もう少し具体的に書いていただいた方がわかりやすいと思いますが・・・

QC言語の処理で違うフォルダ内のファイルに処理する

C言語の処理で違うフォルダ内のファイルに処理する方法がわからなくて困っています。

もし処理の途中でフォルダを指定する方法があれば教えていただけないでしょうか?

よろしくお願いします。

Aベストアンサー

動作環境とか開発環境など、何のC言語か不明ですが、
カレントディレクトリを変更する chdir関数はありませんか?
他には絶対/相対パスでファイルを開く方法もありますけど。

Qc言語でcsvファイルの処理で、処理速度が速いプログラムを書こうと思っ

c言語でcsvファイルの処理で、処理速度が速いプログラムを書こうと思っています。
以下のようなcsvファイル、件数は約10000000件以上あるものを使います
shop,ymd,gend,age,area,amt
20,2008-05-01,3,5,014,128
22,2008-05-01,2,4,015,350
:
二列目の日別、つまりymd別に最後列のamdの小計を出したいんですが、組んだプログラムを実行してみると、セグメンテーション違反ですと出てしまうんです。以下のようなプログラムを組んだんですが

#include <stdio.h>
#include <string.h>
#include <time.h>

#define MM 256

int main()
{
FILE *fp;
char str[MM],*p1, *p2,*ymd;
int num, sum;

clock_t start,end;
start = clock();

fp = fopen("csv.csv","r");

if(fp == NULL){
printf("ファイルが開けませんでした。\n");
return(0);
}

sum = 0;
fgets(str, sizeof(str), fp);
while(fgets(str, sizeof(str), fp) != NULL){
p1 = strtok(str, ",");
p1 = strtok( NULL,",");
ymd = p1;
p2 = strrchr(str,',');
sum[ymd] = atoi(p2+1);
break;
}

while( fgets(str, sizeof(str), fp) != NULL && p1 != NULL){
p1 = strtok(str, ",");
p1 = strtok( NULL,",");
p2 = strrchr(str,',');
if ( p2 != NULL ) {
if(ymd == p1){
sum[ymd] += atoi(p2+1);
}else{
printf("%s ,%d \n",ymd,sum[ymd]);
strcpy(ymd,p1);
}
}
}
printf("%s ,%d \n",p1,sum);
fclose(fp);

end=clock();
printf("%.2f秒\n",(double)(end-start)/CLOCKS_PER_SEC);
return(0);
}

うまくいきません。大体、処理速度は3秒以内を目指しています。
どなたかご教授御願いいたします。

c言語でcsvファイルの処理で、処理速度が速いプログラムを書こうと思っています。
以下のようなcsvファイル、件数は約10000000件以上あるものを使います
shop,ymd,gend,age,area,amt
20,2008-05-01,3,5,014,128
22,2008-05-01,2,4,015,350
:
二列目の日別、つまりymd別に最後列のamdの小計を出したいんですが、組んだプログラムを実行してみると、セグメンテーション違反ですと出てしまうんです。以下のようなプログラムを組んだんですが

#include <stdio.h>
#include <string.h>
#include <time.h>

...続きを読む

Aベストアンサー

No.6です。

>やっぱりポインタはイコールでつなげられないんですか。
ポインタ同士で代入(右辺のアドレスを左辺に入れる等)はできます。

まず、エラーの意味を理解してください。
簡単に書けば「型が違うから代入できない」と言っているのです。

No.6の
--------
>char str[MM],*p1, *p2,ymd1[20], ymd2[20];
と定義しているのに、
>ymd1 = p1;
のような使い方はできませんよ。
--------
について理解されていますでしょうか?

>char str[MM],*p1, *p2,ymd1[20], ymd2[20];
をわかりやすいように分解します。
--------
char str[MM];
char *p1;
char *p2;
char ymd1[20];
char ymd2[20];
--------
p1、p2は「char型のポインタ」
str[]、ymd1[]、ymd2[]は「char型の配列」です。

>ymd1 = p1;
は、ymd[0]に対してp1に格納されているアドレスを代入しようとしているためエラーとなっています。

ひとつアドバイス。
どんなに短いプログラムでも、どこで何の処理を行うのかコメントは降っておいた方が理解しやすいと思う。

No.6です。

>やっぱりポインタはイコールでつなげられないんですか。
ポインタ同士で代入(右辺のアドレスを左辺に入れる等)はできます。

まず、エラーの意味を理解してください。
簡単に書けば「型が違うから代入できない」と言っているのです。

No.6の
--------
>char str[MM],*p1, *p2,ymd1[20], ymd2[20];
と定義しているのに、
>ymd1 = p1;
のような使い方はできませんよ。
--------
について理解されていますでしょうか?

>char str[MM],*p1, *p2,ymd1[20], ymd2[20];
をわかりやす...続きを読む

QC言語でテキストファイルのデータ処理

はじめまして。
僕はC言語に関して全くの初心者です。
どうぞよろしくお願いします。
例えば、

1,0,0,7,6
2,0,0,5,5
3,1,0,4,9
:
:

のようなテキストファイル、test.txtがある時、
1行目の4カラム目(7)と5カラム目(6)を、
それぞれの行について差し引くプログラム、
つまり全ての行について4カラム目は7を引き、
5カラム目は6を引くプログラムの事で、
この例では、


1,0,0,0,0
2,0,0,-2,-1 
3,1,0,-3,-3
:
:


となるようなプログラムを書き、結果を出力したいのですが、よく分かりません。

ちなみにawkで書いて実行すると、
(プログラム名はtest.awkとする)

BEGIN{
i=0;
}

{
while(i<1){
v3 = $4;
v4 = $5;
i++;
}

print $1,$2,$3,($4 - v3),($5 - v4);
}

実行するプログラム↓
awk -f test.awk test.txt

という感じなのですが…。

これを上述の様に、C言語でプログラムを書いて、
実行するには、例えばどのようなプログラムを書けば
いいのでしょうか?
なにぶん初心者のため、分からない事だらけですが、
よろしくお願いしますm(__)m

はじめまして。
僕はC言語に関して全くの初心者です。
どうぞよろしくお願いします。
例えば、

1,0,0,7,6
2,0,0,5,5
3,1,0,4,9
:
:

のようなテキストファイル、test.txtがある時、
1行目の4カラム目(7)と5カラム目(6)を、
それぞれの行について差し引くプログラム、
つまり全ての行について4カラム目は7を引き、
5カラム目は6を引くプログラムの事で、
この例では、


1,0,0,0,0
2,0,0,-2,-1 
3,1,0,-3,-3
:
:


とな...続きを読む

Aベストアンサー

ベタですが、こんな感じかと。
必要に応じて適当に修正して下さい。
-----------------------------------
#include <stdio.h>

int main(int argc, char *argv[]){
FILE *fp;
int v3, v4;
int F[5];
int c;

if(argc != 2){
fprintf(stderr,"usage:test.exe file\n");
return 1;
}
if(NULL==(fp=fopen(argv[argc-1],"r"))){
fprintf(stderr, "%s can't open!",argv[argc-1]);
return 2 ;
}

v3=v4=0;
while(feof(fp)==0){
c=fscanf(fp,"%d,%d,%d,%d,%d",&F[0],&F[1],&F[2],&F[3],&F[4]);
if(c<=0) break;
if(v3==0 && v4==0){
v3=F[3];
v4=F[4];
}
printf("%d,%d,%d,%d,%d\n", F[0], F[1], F[2], F[3]-v3, F[4]-v4);
}
fclose(fp);
return 0;
}

ベタですが、こんな感じかと。
必要に応じて適当に修正して下さい。
-----------------------------------
#include <stdio.h>

int main(int argc, char *argv[]){
FILE *fp;
int v3, v4;
int F[5];
int c;

if(argc != 2){
fprintf(stderr,"usage:test.exe file\n");
return 1;
}
if(NULL==(fp=fopen(argv[argc-1],"r"))){
fprintf(stderr, "%s can't open!",argv[argc-1]);
return 2 ;
}

v3=v4=0;
while(feof(...続きを読む


人気Q&Aランキング

おすすめ情報