• 締切済み

C言語での文字列処理

以下のようなファイルを 年/月/日 時間 値1 値2 値3 値4という風に出力し直したいのです。 1行ごとに段落分けされている場合、 fscanfを使うだけで大丈夫であると思われるのですが、 このように区切られていないデータの処理方法は どのように行えばよいのでしょうか? fgetsを用いてchar型の変数に入れていく方法を考えたのですが、 途中でセグメントエラーが発生しております。 御回答よろしくお願いします。 2004-01-01 00:00:00.000 001 155.00 74.00 -81.00 -3.00 2004-01-01 01:00:00.000 001 346.00 135.00 -211.00 -38.00 2004-01-01 02:00:00.000 001 342.00 138.00 -204.00 -33.00 2004-01-01 03:00:00.000 001 252.00 136.00 -116.00 10.00 2004-01-01 04:00:00.000 001 285.00 142.00 -143.00 0.00 2004-01-01 05:00:00.000 001 512.00 203.00 -309.00 -53.00 2004-01-01 06:00:00.000 001

みんなの回答

回答No.3

> 1行ごとに段落分けされている場合、 > fscanfを使うだけで大丈夫であると思われるのですが、 いえ、1行ごとに段落わけ(改行ですね)されていなくても、fscanf で大丈夫です。 1行ごとのデータだったら作るつもりの、(fscanf() を使った)プログラムを試してみましょう。 そもそも、fscanf() に、(本質的には)改行 という概念はありませんから。 ※もしも、fscanf() の書式指定子に、\n を使っているなら、それだけは削除しましょう。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

1語読んだら1行出力するテキストフィルタを作成して、1語1行の入力をとるプログラムにパイプラインするとか。 そのほうがプログラムを考えやすいかと。 こんな感じ: http://www.ideone.com/CVhAb

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

コードを見せてください。 そうしませんと、解決策の提示のしようがありません。

関連するQ&A

  • 文字、(ホワイト)スペース、数値の混在したデータの読み込み(C言語)

    Initial  time  01:05  date  00/01/01 name a:2 b:3 10 20 30 ・ ・ ・ 上記のようなテキストファイルで、6行目以降の数値を配列に格納して統計処理を考えています。自分ではfgetsが行の終端まで読むのを利用して、まず十分な長さのchar型配列を5つ用意し、1行目~5行目まではそれに格納し、6行目以降はfscanfで読む事を考えたのですが、printfで表示させると格納した文字や、計算の結果期待できる数値と異なる表示になってしまいます。良い方法があれば教えて頂きたく存じます。よろしくお願い致します。

  • :C言語でわからないところがあるのですが

    char a[]={   "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",   "ccccccccccccccccccccccccddddddddddd" }; という変数があります。 この変数a[0]の値を, char line[2]; に2つに分けていれたいんです。 line[0]="aaaaaaaaaaaaaaaaaaaaaaaa"; と line[1]="bbbbbbbbbbbbbbbbbbbbbbbb"; というふうに。 いろいろ試しては見たのですが,ポインタがからんでくるので,フリーズしまくりながらもいろいろやっては見たのですがうまくできませんでした。 どのようにすればできるでしょうか?

  • C言語のファイル処理について

    環境 OS:Windows VISTA Ultimate コンパイラ:Borland C++ Compiler 5.5 Cの基礎的な勉強をしています。2つほど質問があります。 1つ目は、ファイル処理の勉強としてプログラムを作っているのですがファイルが上手く開けません。プログラムとしてはファイルを開いて、ファイル内に記述されている数値を取り出し、計算を行う簡単なものを作っています。ソースは以下のものになります。 #define N 256 int file_read(char filename[] , int count[]) { int m; FILE *fp; fp=fopen(filename,"r"); if(fp==NULL) { /* オープン失敗 */ printf("Not Found File\n"); return -1; /* 戻り値-1 */ } while((m = fgetc(fp)) != EOF) { 読み取った数値配列に格納する処理 } fclose(fp); return 0; } int operation(int count[]) { 計算処理 return 0; } int main(void) { int *count[N]; char *filename[256]; memset(count, 0, sizeof(count)); /* 変数・配列初期化 */ printf("Please Input Filename:"); fgets(filename, sizeof(filename), stdin ); if(file_read(filename,count) != -1) operation(count); return 0; }  バッファオーバーランの事を考え、fgetsによるキー入力にしたのですがファイルオープン失敗になってしまいます。fgetsのあと、変数filenameの中身を確認したところ、キー入力した文字はきちんと代入されていました。オープンするファイルはきちんとあるのですが・・。  fgetsをscanfに変えた場合は上手くいくので書式指定をしてscanfを使えばいいのでしょうが、なぜfgetsで上手くいかないでしょうか? 2つ目はgetchar()とfgets()に関してです。 while((c = getchar()) != EOF) { . .処理 . fgets(変数, sizeof(変数), stdin ); . .処理 . } とした場合、fgetsの処理が無視されてしまいます。 これはどういったことが原因なのでしょうか。 ご教授、お願いいたします。

  • c言語 文字列の比較

    ファイルから読み込んだ文字列と入力した文字列を比較して同じなら次の処理を行いたいんですが、入力が例えば同じ1212でもstrcmp()で181がかえってきます。原因は何なのでしょうか? #define BUFMAX=45;  char smsg[BUFMAX];  char pass[BUFMAX];  printf("pass=%s\n",pass); printf("smsg=%s\n",smsg); c=smsg; stc=strcmp(pass,c); passにはscanfで1212を読み込みます。 smsgにはfgetsでファイルから一行読み込みます。 テキストのなかみは1212が一行はいっています。 自分では全く見当がつかないので、回答していただける方がいれば、ヒントでもいいのでお願いします。

  • 1ByteのChar型変数を文字列として扱いたい

    1Byteのchar型変数に入ってる値を文字列として扱う方法を教えて下さい Char a; a=30; この30を文字列として出力したいのです 期待している出力:30 判る方、よろしくお願いします

  • fgetsなどをもちいて「改ページ」までの文字列を読み込みたい

    ファイルから1行ずつデータを読み込んで処理をするプログラムを書いています。 現在はfgets関数を用いて FILE *stream; char line[100]; ~ fgets(line, 100, stream); という風に1行ずつ読み込んでいるのですが、この方法だと、改行は認識できても、「改ページ」は認識できず、改ページも行中の文字だと認識して続きを読み込んでいってしまいます。 たとえば あいうえお[改ページ] かきくけこ[改行] さしすせそ[改行] というファイルであった場合、 line配列には「あいうえお[改ページ]かきくけこ」と読み込まれてしまいます。 本当は 1回目で「あいうえお」、2回目で「かきくけこ」と読み込むようにしたいのですが、このような読み込み方はどのようにすればいいのでしょうか。 一度とりあえず改ページコードごと読み込んで、1文字ずつチェックして・・・という手作業をするしかないのでしょうか? いい方法がありましたら教えてください。

  • 教えていただけませんか?C言語 文字列について

    学校で文字列のプログラムを組む課題が出ました 以下のような課題です 1つの文字列を読み込んで,ピリオドで改行し出力するプログラムを作成しろ ・読み込む文字列の長さ 最大で80文字 ・文字列の終わりは必ずピリオドで ・文字列の途中に現れるピリオドの次には必ずスペースが続く ・ピリオドに続くスペースは出力しない 例えば Hello. It is fine. Good-bye.  と打つと Hello. It is fine. Good-bye. と表示されるようなプログラムです そして自分で以下のプログラムを組みました ----------------------------------------------------------- #include <stdio.h> #include <string.h> int main(void){ int i; char A[100]; char *a; fgets(A,80,stdin); a = strtok(A, "."); printf("%s.\n",a); while(a != NULL){ a = strtok(NULL,"."); if (a != NULL){ printf("%s.\n",a); } } return 0; } --------------------------------------------------------------- ですがこれだとピリオドの後のスペースと文字列の後によくわからない改行が出力されてしまいます 自分で何とかするべきなのでしょうがどうにもうまく行きません どこをどうすればいいのか教えていただけないでしょうか?

  • 変数操作(C言語)

    C言語でプログラムを書いてます。 char1[0]:1 char1[1]:5   ↓ char2[0]:1 char2[1]:NULL char2[2]:NULL char2[3]:NULL char2[4]:5 char2[5]:NULL という風に値の順番と配列の順番を別の変数で一緒にしたいのです。1から5までの値はNULL、また5以降はNULLといったように値を格納したいのです。 こういったロジックの組み方のご教授願います。 また値が2、4でも対応できるような(どんな数でも)ものでお願いします。(↓例) char1[0]:2 char1[1]:4   ↓ char2[0]:NULL char2[1]:2 char2[2]:NULL char2[3]:4 char2[4]:NULL char2[5]:NULL よろしくお願い致します。

  • fgetsでエラー

     C言語を勉強しているものです。 fgetsやfscanfで第一引数にダブルポインタ変数を用いるとエラーが出ます。 なぜそうなるんでしょうか? ダブルポインタだと不可能なんでしょうか? char **moji; FILE *fp; moji = (char**)malloc(sizeof(char*) * 128 * 256); fp = fopen("test.txt","r+"); fgets(moji[0], 26, fp); //ここでエラー mojiを[0]で指定してあげてもエラーなんでしょうか? fgetsだけでなくfscanfでもそうです。 どうしてそうなんるんでしょう?

  • c言語で定義する変数のアドレス

    c言語の超初心者です。追いえてください。 c言語で2つの変数を定義しています。 char *a; char *b; この2つの変数に値をいれた際の動作で以下のようなことって発生しますか? a="1111" b="2222" aをprintfするとbにいれた値"2222"が表示される。

専門家に質問してみよう