• ベストアンサー

テキストファイルを読み込み、CSV形式に出力する方法がわかりません!

KOKUGO_TEN=90 SEITO_NUM=0012 TEST_DATE=1030 というファイルを読み込み 90,0012,1030, と出力したいんですが #Iinclude <stdio.h> type struct{ char kokugo[KOKUGO +1]; char seito[SEITO +1]; char test[TEST +1]; } seiseki; int Intxtfile(seiseki *txtstr, char *ptxt); int Outcsvfile(seiseki *csvstr, char *pcsv); int main(int argc, char *argv[]) { char txtfile[256] char csvfile[256] seiseki filedata; int in = 0; int out = 0; in = Intxtfile(&filedata, txtfile); if(In == -1){ return 1; } out = Outcsvfile(&filedata, csvfile); if(Out == -1){ retrun 1; } return 0; } int Intxtfile(seiseki *txtstr, char *ptxt)   /* テキストファイル読み取り関数*/ { FILE *fp; fp = fopen("moshi.txt", "r"); if(fp == NULL){ puts("ファイルオープンエラー"); return 1; } fclose(fp); return 0; } int Outcsvfile(seiseki *csvstr, char *pcsv) /*CSV出力関数*/ { FILE *fp2; fp2 == fopen("moshi.csv", "w"); if(fp2 == NULL){ puts("ファイルオープンエラー"); return 1; } fprintf(fp2, "%s,%s,%s, \n, csvstr -> kokugo, csvstr -> seito, csvstr -> test); fclose(fp); return 0; } エラー処理は中途半端なんですが、これを開くと ファイルオープンエラーになってしまいます。 どこが間違ってますか? 読み取り関数と出力関数は必要なんですが、もっと簡単な方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.7

こんなことがしたいのでしょうか。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define KOKUGO (2) #define SEITO (4) #define TEST (4) #define OK (0) #define NG !(OK) typedef struct { char kokugo[KOKUGO+1]; char seito[SEITO+1]; char test[TEST+1]; } seiseki; int openFiles(FILE **fpin, FILE **fpout) { *fpin = fopen("moshi.txt", "r"); *fpout = fopen("moshi.csv", "w"); return (fpin && fpout) ? OK : NG; } seiseki readTextFile(FILE *fp) { seiseki data; char str[80]; char *dlm = "=", *wk; int n = 0; while (fgets(str, sizeof(str), fp)) { if (str[strlen(str)-1] == '\n') { str[strlen(str)-1] = '\0'; } strtok(str, dlm); wk = strtok(NULL, dlm); strcpy((n == 0) ? data.kokugo : (n == 1) ? data.seito : data.test, wk); n++; } return data; } void writeCSVFile(FILE *fp, seiseki data) { fprintf(fp, "%s,%s,%s,", data.kokugo, data.seito, data.test); } void closeFiles(FILE *fpin, FILE *fpout) { fclose(fpin); fclose(fpout); } int main(void) { seiseki data; FILE *fpin, *fpout; if (openFiles(&fpin, &fpout) == NG) { fprintf(stderr, "ファイルオープンエラー\n"); exit(1); } data = readTextFile(fpin); writeCSVFile(fpout, data); closeFiles(fpin, fpout); return 0; }

その他の回答 (7)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.8

> #define OK (0) > #define NG !(OK) 実勢には影響を及ぼしませんが、C言語の考え方からすると 下記の方がよかったかもしれません。 #define NG (0) #define OK !(NG)

age_03
質問者

お礼

丁寧に何度もありがとうございました。 おかげさまでなんとか出来ました。 友達の課題等をもらって勉強してるんですが、 答えは無いし、友達はもうわからないという事で困ってました。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

とりあえず、"ファイルオープンエラー"の原因としては、カレントディレクトリが合っていないのではないかと。 > fp = fopen("moshi.txt", "r"); じゃなくて、 fp = fopen("c:\\xxxx\\yyyy\\zzzzz\\moshi.txt", "r"); といった感じで指定してみるとどうなりますか?

  • t-sazen
  • ベストアンサー率42% (37/87)
回答No.5

漠然と読んでてですね・・・ 気になるところが・・・・ int Intxtfile(seiseki *txtstr, char *ptxt)関数は正常にファイルが読み込めたとき0を返し、エラーで1を返す。 int Outcsvfile(seiseki *csvstr, char *pcsv) 関数も正常終了なら0を返し、エラーで1を返す。。。 だとしたらですよ、in = Intxtfile(&filedata, txtfile);のところではinは0か1に決まるでしょ? out = Outcsvfile(&filedata, csvfile);もそう。outは0か1しかないんです。 でも次のif(in == -1){でinが-1ならExitCodeを1にして処理終了。outも同じで-1が戻ってきたらExitCodeを1にして処理終了。 論理的に成り立っていません。 つまりこのmain関数はExitCodeを0にして正常終了するしかないんです。 それを踏まえてみても、コンパイラはエラーを出しませんでしたよ。 (VC++6で試しにコンパイルしてみた) それにですね、moshi.txtが存在しなかった時のみファイルオープンエラーがでました、当然ですね。fpがNULLで帰って来ますもん。 ということはmoshi.txtが実行ディレクトリになかったと断言せざるをえないです。 つか、大体読み込みファイルをオープンだけして、すぐ閉じるのに何か意味はあるんですか??? テキストファイル・・・読みに行かないんですか? 勿論、(項目名)=(数値)を項目名を見つつ、数値のみ取り出すルーチンも必要ですがそれが全く欠落してます。。。 結論:貴方は”何を”、”どうしたい”んですか?

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

> で一応コンパイラは通ります。 いいえ。通りません。逐一指摘してみましょうか。 > #Iinclude <stdio.h> スペル間違い。 > type struct{ typeというキーワードはない。 > char kokugo[KOKUGO +1]; > char seito[SEITO +1]; > char test[TEST +1]; KOKOGO, SEITO, TEST の値が不明。おそらく#define抜け。 > if(In == -1){ Inという変数は定義していない。 > retrun 1; retrunという名前の文はない。 疲れたので以下は省略します。 実行時の「ファイルオープンエラー」が出るということは、 お手元にはコンパイルの通ったコードがあるはずですので、 お願いですから、それをそっくりそのまま見せてくださいませんか?

age_03
質問者

補足

#include <stdio.h> #define KOKUGO 2 #define SEITO 4 #define TEST 4 typedef struct{ char kokugo[KOKUGO +1]; char seito[SEITO +1]; char test[TEST +1]; } seiseki; int Intxtfile(seiseki *txtstr, char *ptxt); int Outcsvfile(seiseki *csvstr, char *pcsv); int main(int argc, char *argv[]) { char txtfile[256] char csvfile[256] seiseki filedata; int in = 0; int out = 0; in = Intxtfile(&filedata, txtfile); if(in == -1){ return 1; } out = Outcsvfile(&filedata, csvfile); if(out == -1){ return 1; } return 0; } int Intxtfile(seiseki *txtstr, char *ptxt)   /* テキストファイル読み取り関数*/ { FILE *fp; fp = fopen("moshi.txt", "r"); if(fp == NULL){ puts("ファイルオープンエラー"); return 1; } fclose(fp); return 0; } int Outcsvfile(seiseki *csvstr, char *pcsv) /*CSV出力関数*/ { FILE *fp2; fp2 = fopen("moshi.csv", "w"); if(fp2 == NULL){ puts("ファイルオープンエラー"); return 1; } fprintf(fp2, "%s,%s,%s, \n", csvstr -> kokugo, csvstr -> seito, csvstr -> test); fclose(fp2); return 0; } です。よろしくお願いします。

回答No.3

変数名の大文字小文字が誤っているところがあります。 出力でクローズしているファイルポインタも宣言していないものになっています、 ・・・・とりあえず、コンパイルが通ると仮定して、 エラーとなるのは入力と出力どちらでですか? そして一番重要なのは「moshi.txt」が、実行ディレクトリ内にありますか?

age_03
質問者

補足

in, outですね。 申し訳ない。 一番重要なものがありませんでした。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

他にもいろいろと、コンパイルエラーの要因となる箇所があります。 さしあたり、コンパイルエラーが出ないコードをそのままコピー&ペーストしていただけますか?

age_03
質問者

補足

fp = fopen("ptxt", "r"); fp = fopen("pcsv", "r"); で一応コンパイラは通ります。

回答No.1

とりあえず、 >fp2 == fopen("moshi.csv", "w"); この行は fp2 = fopen("moshi.csv", "w"); では?

age_03
質問者

補足

ですね。書き間違えです。すいません。 fp2 = fopen("moshi.csv", "w"); ということでお願いします。

関連するQ&A

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • ある関数のソースがわかりません。

    KOKUGO=100 SUUGAKU=80 RIKA=0 SYAKAI=60 というファイルを取得して数字だけ構造体に渡す関数のソースです。 define KOKUGO 3; define SUUGAKU 2; define RIKA 1; define SYAKAI 2; 構造体は typedef struct{ char koku[KOKUGO +1]; char suu[SUUGAKU +1]; char rika[RIKA + 1]; char sya[SYAKAI + 1]; }data; です。 全体ではデータを読み取ってcsv形式で出力するプログラムなんですが main関数、出力関数はちょっと省きます。 int Readfile(data *txtfile, char *ptxt) { FILE *fp; char *fullcode = NULL; char search = '='; char buff[30] = {'\0'}; int enum[4] = {'\0'}; int err = 0; char *rtxt = NULL; /*ファイルオープン*/   fp = fopen(ptxt, "r"); if(fp == NULL){ puts("オープンエラー"); return(1); } /*ファイル読み取り*/   while(1){ /*データを一行ずつ読み取り*/    rtxt = fgets(buff, sizeof(buff), fp); if(rtxt == NULL){ break; } /*データ名確認*/    if(strncmp(buff, "KOKUGO=", 7) == 0){ ••••••••••• (1) /*'='を含むデータ確認*/   fullcode = strchr(buff, search); /*'='より後ろの点数確認*/ fullcode += 1; /*点数桁数確認*/   if(strlen(fullcode) == KOKUGO + 1){ /*構造体に点数のみ格納*/     strncpy(txtstr -> koku, fullcode, KOKUGO); enum[0] += 1; }else{ puts("データが違います") return(1); } }else if(strncmp(buff, "SUUGAKU=", 8) == 0){   fullcode = strchr(buff, search); fullcode += 1;   if(strlen(fullcode) == SUUGAKU + 1){     strncpy(txtstr -> suu, fullcode, SUUGAKU); enum[1] += 1; }else{ puts("データが違います") return(1); } } else if(strncmp(buff, "RIKA=", 5) == 0){   fullcode = strchr(buff, search); fullcode += 1;   if(strlen(fullcode) == RIKA + 1){     strncpy(txtstr -> rika, fullcode, RIKA); enum[2] += 1; }else{ puts("データが違います") return(1); } } else if(strncmp(buff, "SYAKAI=", 7) == 0){   fullcode = strchr(buff, search); fullcode += 1;   if(strlen(fullcode) == SYAKAI + 1){     strncpy(txtstr -> sya, fullcode, SYAKAI); enum[3] += 1; }else{ puts("データが違います") return(1); } } } for(err = 0; err < 4; err ++){ if(enum[err] != 1){ puts("データが違います"); return(1); } } /*ファイルを閉じる*/   fclose(fp); return(0); } という風に書いてあるんですが(1)の部分で7文字比較して等しければ 次の/*'='を含むデータ確認*/に進むと思うんですが等しくなければ どういう処理が行われ、どこに進むのかわかりません。 基本的にこの無限ループの流れがわかりません。 このソースの読み方を教えてください。 友達が以前書いたソースなんですが聞いてももうわからないらしくて・・・。    すいませんが、勉強し始めたばかりなので詳しくお願いします。

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • テキスト→配列化→ソートをしたいのですが

    テキストファイル:test.txt 内容:カンマで区切られた数値で最大20個 を読み込んで配列に組み込んでその配列を昇順ソートする。 と言うC言語の課題が内定先の企業より出題されたのですが 今まではC#やデータベース中心だったので 全く解らず困っています。 #include <stdio.h> int main(void) { /* ファイルポインタ */ FILE *fp; int f; fp = fopen( "test.txt", "r" ); if( fp == NULL ) { puts( "test.txtが開けません" ); return 1; } while( 1 ) { f = fgetc( fp ); if( ferror( fp ) ) { /* fgetc関数に対するエラーチェック */ puts( "読み込み中にエラーが発生しました" ); fclose( fp ); return 1; } else if( feof( fp ) ) { break; } printf( "%c", f ); } printf( "\n" ); fclose( fp ); return 0; } } 他のサイト等を参考にファイルを読み込むまでは出来たのですが そこから先が全くわかりません・・・・orz どうかよろしくお願いしますm(_ _)m

  • 2つのテキストファイルのマージについて

    現在C言語を学習中の超初心者の者です。C言語のファイル処理や関数、マージ、ポインタの処理に悪戦苦闘している日々を送っています(泣) 皆様に、是非、アドバイスを頂けたらと思い、投稿させて頂きました。 2つのテキストファイルを読み込み、それぞれ、ファイルの中身の文字列をソートし、昇順に並び替え、さらに、その2つのファイルをマージし、昇順に並び替え表示させる(関数を用いて)課題をクリアできずにいます。 int main(void) { char strAry1[20][20]; char strAry2[20][20]; //ファイル1"menber1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル1情報ソート sortString( ); //ファイル1ソート後出力 putOut( ); //ファイル2"kantoku1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル2情報ソート sortString( ); //ファイル2ソート後出力 putOut( ); return 0; } main()関数はこのようなイメージで考えているのですが、どうのように処理すればよいのでしうか?(泣)質問がアバウトで申し訳ありません。ちなみに、2つのテキストファイルの中身は (1) "menber1.txt"-------- takahara inamoto endou nakazawa komano abe nakamura (2) "kantoku1.txt"------ torushie ofuto jico oshimu kamo okada farukan です。一応、途中まで考えて、いきずまってしまったソースです。→ int getData(char *filename, int count, char ss[][20]); void putOut( char ss[][20], int count); void sortString( char ss[][20], int count); int main(void) { char strAry1[20][20]; char strAry2[20][20]; int count = 7; //ファイル1情報を取得 getData("menber1.txt", count, strAry1); //ファイル1ソート前出力 putOut( strAry1, count); //ファイル1情報ソート sortString(strAry1, count ); //ファイル1ソート後出力 putOut( strAry1, count); //ファイル2情報を取得 getData("kantoku1.txt", count, strAry2); //ファイル1ソート前出力 putOut( strAry2, count); //ファイル2情報ソート sortString(strAry2, count ); //ファイル2ソート後出力 putOut( strAry2, count); return 0; } //ファイル情報を取得  int getData(char *filename, int count, char ss[][20]) {      FILE *fp1; if((fp1 = fopen(filename, "r")) == NULL){ //ファイルオープン printf("ファイルオープンできません\n"); exit(1); } count = 0; while(fp1 != NULL){ fgets(ss[count], 20, fp1); //1行単位で文字列取得 if(feof(fp1)) break; count++; } fclose(fp1); return 0; } //ファイルを出力する void putOut( char ss[][20], int count) { int i; for(i=0; i<count; i++){ printf("%s",ss[i]); } printf("\n"); } //ファイルをソートする void sortString( char ss[][20], int count) { int i,j; char temp[20]; for(i=0; i<count-1; i++){ for(j=i+1; j<count; j++){ if(strcmp(ss[i], ss[j]) > 0){ strcpy(temp, ss[i]); strcpy(ss[i], ss[j]); strcpy(ss[j], temp); } } } printf("ソート後\n"); } 少しでも情報がほしいです(泣)皆様忙しいと思いますが、助言をお願い致します。

  • C言語による構造体の値渡しについて

    以下プログラムを作成しました。 1.read_file関数によりファイルを読み込み。 2.avg_kokugo関数により、国語の平均点を出す。 という流れで組まれているのですが、 1.read_file関数実行時に、dat構造体を渡しています。 2.read_file関数内で、fscanfによる読み込みを行い、dat[i].name,&dat[i].kokugo,&dat[i].sansuに格納しているみたいに感じます。 ここで、疑問なのが、 「構造体を値渡しでdatをread_file関数に渡してる」と思っているのですが、 「read_file関数から、値渡しで渡された構造体datに、値を格納することはできるのでしょうか?」 本を参考にして勉強していたのですが、 「構造体は、値渡しの時に読み込みはできるが、更新はできない」 と書かれていたのです。(ポインタ参照渡しの時は可能。) なぜ今回、read_file関数から、構造体datに値の格納ができるのでしょうか? 更新と新規格納は意味が異なるからなのでしょうか? ご教授よろしくお願いします。 <ソース> #include <stdio.h> //グローバル #define FNAME "test.txt" struct score{ char name[20]; int kokugo; int sansu; }; int read_file(struct score dat[],int n); float avg_kokugo(struct score dat[],int n); int main(void){ struct score dat[3]; int ret; float kokugo; float sansu; ret= read_file(dat,3); if(ret <0){ return 0; } kokugo = avg_kokugo(dat,3); printf("国語の平均 %.1f\n",kokugo); return 0; } int read_file(struct score dat[],int n){ FILE *fp; //ファイルポインタ int i; fp=fopen(FNAME,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return -1; //-1によるプログラム強制終了 } //データ読み込み i=0; //datに保存していく。 while((fscanf(fp,"%s%d%d",dat[i].name,&dat[i].kokugo,&dat[i].sansu)) != EOF){ i=i+1; //ファイル件数読み込み } fclose(fp); return 0; } float avg_kokugo(struct score dat[],int n){ int sum; //合計 float answer; int i; sum=0; for(i=0;i<n;i++){ sum = sum + dat[i].kokugo; } //平均点を求める answer =(float)sum / (float)n; return answer; }

  • ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込

    ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込みプログラム」をそのままコンパイルして実行しようと思ったのですが、 sample.c: In function 'main': sample2.c:9: warning: return type of 'main' is not 'int' と、表示されてしまいます。 プログラミング初心者なので、どこが間違っているのかわかりません。 回答またはアドバイスの程、よろしくお願いいたします。 ネットで落ちていたプログラムを以下に記載します。 sample2.c #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("コマンドの入力形式が間違っています.\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("ファイルがオープンできません[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("データが不正です[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("エラー(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("エラー(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("エラー(3)\n"); break; } if(*wp != '\0'){ printf("エラー(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); }

  • テキストファイルの内容を2次元配列に格納したい

    課題で用意されたテキストファイルを読み込み、空白を区切りとする文字列の単位で配列に格納したいのですが、やりかたがわかりません。 ソースプログラムですが #include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 1000 int TextSplit(char *fname, char (*SpStr)[50]); int main(void) { int i, n; char fname[MAX], SpStr[MAX][50]; int Split; FILE *fp; printf("input File =>"); scanf("%s", fname); Split = TextSplit(fname, SpStr); printf("\n %d[文字列数] \n", Split); return 0; } int TextSplit(char *fname, char (*SpStr)[50]) { int i, j, k; char Readstr[MAX]; FILE *fp; fp = fopen(fname, "r"); if(fp == NULL) { printf("ファイルオープン失敗"); return 1; } i = 0; while(fscanf(fp, "%s", SpStr) != EOF) { i++; } fclose(fp); return i; } 以上のソースプログラムですが、内容は「空白で区切る文字列の単位の総数を表示する」ものになっています。 今日の20時までに終わらせないといけないので、ご教授お願いします。 使ってるソフトはMicrosoft Visual Studioです。

  • C言語、fgetcを利用しファイルの内容を変数に

    C言語について質問です C言語のfgetcを利用しファイルの内容を変数にいれてそれを返す関数を作っているのですがうまくいきません <!--以下ソース--> char *file_get_contents(char *filename){ FILE *fp; int c; char *return_str; if((fp=fopen(filename,"r"))==NULL) return NULL; while((c=fgetc(fp))!=EOF ){ sprintf(return_str,"%c",c); } fclose(fp); return return_str; } 誰か理由と改善方法を教えてください!

専門家に質問してみよう