Article View: fj.lang.c
Article #507Re: [Q]区切りなしデータを文字型でない配列に読むには?
From: Masao Seki
Date: Fri, 20 Mar 1998 00:00
Date: Fri, 20 Mar 1998 00:00
73 lines
2791 bytes
2791 bytes
Tomoaki Chiba wrote:
> 「可能な限り簡潔に」とは、ソースコードとしても短く、かつ、オンライン
> マニュアルを読めて「はじ゚てのC」(技術評論社)程度にC言語の知識を
> 持ち合わせている(C++はほとんどわからない)人が、ソースプログラム
> を読んで多くてもせいぜい10回程度(そのプログラムを)読み返すだけで理
> 解できるレベルと考えて下さい。
以下のようにするのは、どんなものでしょう。5、6回読めば、肝の部分は
理解できると思いますが。
文字列長さに半端があった時、先頭データで吸収するのか最後でするのか、
仕様がなかったので、楽な先頭の方にしました。
fgetsで文字列データをとりこんだ時、改行コードも取り込まれるシステム
を想定しています。エラー処理その他の、御質問の趣旨からはずれると思わ
れる部分は、かなり手抜きしています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXLENG 500
#define MAXLINE 100
#define WID 5
int main(int ac, int **av)
{
int m, n, n9, jverb = 0;
int ndata[MAXLINE][MAXLENG/WID];
unsigned char cbuf[MAXLENG+1], *p, save;
size_t len;
FILE *fp = stdin;
if (ac > 1) jverb = 1;
cbuf[MAXLENG] = '\0';
for (m=0; m < MAXLINE; m++) {
if (fgets(cbuf, MAXLENG, fp) == NULL || feof(fp)) break;
else {
len = strlen(cbuf) - 1;
if (cbuf[len] != '\n') {
cbuf[10] = '\0';
fprintf(stderr, "too long line. %d: |%s ・・・ %s|\n",
m, cbuf, cbuf+MAXLENG-10);
return 1;
}
}
for (; isspace(cbuf[len-1]); len--) ;
n9 = (len + WID -1)/WID;
p = cbuf + ((len-1) % WID) + 1;
save = *p; *p = '\0';
ndata[m][0] = atoi(cbuf); *p = save;
for (n=1; n < n9; n++, p += WID) {
save = p[WID]; p[WID] = '\0';
ndata[m][n] = atoi(p);
p[WID] = save;
}
if (jverb) {
fprintf(stdout, "%3d: ", m);
for (n=0; n < 5; n++)
fprintf(stdout, "%*d ", WID, ndata[m][n]);
fprintf(stdout, "・・・ ");
for (n=n9-5; n < n9; n++)
fprintf(stdout, "%*d ", WID, ndata[m][n]);
fprintf(stdout, "\n");
}
}
return 0;
}
--
関 正生 <masao.seki@fujixerox.co.jp || ma-seki@gb3.so-net.or.jp>
Technical Details
Message-ID:
<35120784.56D9@rim.crl.fujixerox.co.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<6esjd9$4t@sakunami.gw.tohoku.ac.jp>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 106434,8756f6f59b5f78c5 X-Google-Attributes: gid106434,public From: Masao Seki <seki@rim.crl.fujixerox.co.jp> Subject: Re: [Q]区切りなしデータを文字型でない配列に読むには? Date: 1998/03/20 Message-ID: <35120784.56D9@rim.crl.fujixerox.co.jp> X-Deja-AN: 335852243 Content-Transfer-Encoding: 7bit References: <6esjd9$4t@sakunami.gw.tohoku.ac.jp> Mime-Version: 1.0 Reply-To: masao.seki@fujixerox.co.jp Content-Type: text/plain; charset=iso-2022-jp Organization: Fuji Xerox Newsgroups: fj.lang.c