基本情報技術者試験 平成15年度・秋期・午後 問10 ソースプログラム
/*
基本情報技術者試験 平成15年度・秋期・午後 問6
BohYoh Shibata PREPARATION
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TBLSZ 64
#define RECSZ 256
int loadcsv( char*, char*[][TBLSZ] );
void savecsv( char*, char*[][TBLSZ], int );
int loadcsv( char fname[], char *tbl[][TBLSZ] )
{
FILE *fp;
char buf[RECSZ], *cp, *dp;
int col, row, len;
for ( row = 0; row < TBLSZ; row++ ) {
for ( col = 0; col < TBLSZ; col++ ) tbl[row][col] = NULL;
}
fp = fopen( fname, "r" );
for ( row = 0; fgets( buf, RECSZ, fp ) != NULL; row++ ) {
col = 0;
for ( cp = buf; *cp != '\n'; cp++ ) {
while ( *cp == ' ' ) cp++; /* 空白の読み飛ばし */
if ( *cp == '\n' ) break;
else if ( *cp == ',' ) col++ ; /* コンマの処理 */
else {
if ( *cp == '\"' ) { /* データが引用符で囲まれている場合 */
dp = ++cp ;
for ( len = 0; *cp != '\"'; len++, ++cp );
}
else {
dp = cp ;
for ( len = 0; *cp != '\n'; len++, ++cp )
if (( *cp == ' ' ) || ( *cp == ',' )
|| ( *cp == '\n' )) break;
cp-- ;
}
if ( len != 0 ) { /* データが空でない場合 */
tbl[row][col] = malloc( len+1 );
/* 動的に領域を確保 */
strncpy( tbl[row][col], dp, len );
*(tbl[row][col]+len) = '\0';
}
}
}
}
fclose( fp );
return row;
}
void savecsv( char fname[], char *tbl[][TBLSZ], int ln )
{
FILE *fp;
int row, col, last;
fp = fopen( fname, "w" );
for ( row = 0; row < ln; row++ ) {
for ( last = TBLSZ-1; last >= 0; last-- )
if ( tbl[row][last] != NULL ) break;
for ( col = 0; col <= last; col++ ) {
if ( tbl[row][col] != NULL ) {
fputs( "\"", fp );
fputs( tbl[row][col], fp );
fputs( "\"", fp );
}
if ( col < last ) fputs( ",", fp );
}
fputs( "\n", fp );
}
fclose( fp );
}