BohYoh.comトップページへ

基本情報技術者試験 平成15年度・秋期・午後 問10 ソースプログラム

C言語講座へ  情報処理技術者試験対策講座へ  情報処理技術者試験対策講座(C言語)へ 
/*
    基本情報技術者試験          平成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 );
}