←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4315

ファイル処理「¥」について
投稿者---KEIT(2005/07/16 18:55:26)


WINDOWDSxp CPad

main関数でファイルをオープンし、読み出しします。
そしてファイルデータチェック関数
data_check_flag = data_check(buf);をmainから呼び出しています。

関数呼び出し前はbufの中身は"201001,aso taro,2,3,1\r\n",'\0'なのですが、呼び出し後は"201001\000aso taro\0002\0003,1\000\n",'\0'となっているようです。

この時再度strtok関数でtoken_p = strtok(buf, ",");で切り出してもかまわないのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイル処理「¥」について 4316 まきじ 2005/07/16 19:52:48
<子記事> Re:ファイル処理「¥」について 4317 YuO 2005/07/16 19:53:03
<子記事> Re:ファイル処理「¥」について 4318 KEIT 2005/07/16 19:57:07
<子記事> Re:ファイル処理「¥」について 4354 shu 2005/07/20 01:21:20


No.4316

Re:ファイル処理「¥」について
投稿者---まきじ(2005/07/16 19:52:48)


>呼び出し後は"201001\000aso taro\0002\0003,1\000\n",'\0'となっているようです。
>この時再度strtok関数でtoken_p = strtok(buf, ",");で切り出してもかまわないのでしょうか?

何をしたいのか、解らないですが、
"201001\000aso taro\0002\0003,1\000\n" を
"201001\000aso taro\0002\0003" と "1\000" に分けたいのでしょうか?


この投稿にコメントする

削除パスワード

No.4317

Re:ファイル処理「¥」について
投稿者---YuO(2005/07/16 19:53:03)


何がしたいのかが全く読み取れないのですが……。


>この時再度strtok関数でtoken_p = strtok(buf, ",");で切り出してもかまわないのでしょうか?

そうしたいのであればすればよいだけの話です。
何を問題視しているのか全くわからない現在の状況では,
そうとしか答えようがありません。



この投稿にコメントする

削除パスワード

No.4318

Re:ファイル処理「¥」について
投稿者---KEIT(2005/07/16 19:57:07)


>関数呼び出し前はbufの中身は"201001,aso taro,2,3,1\r\n",'\0'なのですが、呼び出し後は"201001\000aso taro\0002\0003,1\000\n",'\0'となっているようです。

>この時再度strtok関数でtoken_p = strtok(buf, ",");で切り出してもかまわないのでしょうか?

つまり前者と後者は表記異なるが同じ意味でしょうか?ということを知りたいのですが。



この投稿にコメントする

削除パスワード

No.4320

Re:ファイル処理「¥」について
投稿者---まきじ(2005/07/16 20:02:53)


>つまり前者と後者は表記異なるが同じ意味でしょうか?ということを知りたいのですが。

KEITさんが、仰る「同じ意味」とは?
もっと、具体的に説明をお願いします。



この投稿にコメントする

削除パスワード

No.4321

Re:ファイル処理「¥」について
投稿者---KEIT(2005/07/16 20:13:59)


>>つまり前者と後者は表記異なるが同じ意味でしょうか?ということを知りたいのですが。
>>KEITさんが、仰る「同じ意味」とは?
つまり「,」と「\000」がです。




この投稿にコメントする

削除パスワード

No.4322

Re:ファイル処理「¥」について
投稿者---まきじ(2005/07/16 20:16:01)


>つまり「,」と「\000」がです。

違います。


この投稿にコメントする

削除パスワード

No.4323

Re:ファイル処理「¥」について
投稿者---まきじ(2005/07/16 20:21:32)


ファイルから buf に、1 行を読み込み、それを、data_check() で、
, を \ に変えて、数字の前を 0 で埋めて、3 文字にしてるだけでしょう。


この投稿にコメントする

削除パスワード

No.4324

Re:ファイル処理「¥」について
投稿者---KEIT(2005/07/16 20:25:24)


>ファイルから buf に、1 行を読み込み、それを、data_check() で、
>, を \ に変えて、数字の前を 0 で埋めて、3 文字にしてるだけでしょう。

ここで本題なのですが、なぜそのような処理をしているのでしょうか?
私はdata_check()ではデータチェックをしているだけなのですが、、、

ちなみに「\000」はstrtokで切り出せるのでしょうか?


この投稿にコメントする

削除パスワード

No.4327

Re:ファイル処理「¥」について
投稿者---まきじ(2005/07/16 20:45:36)


>ここで本題なのですが、なぜそのような処理をしているのでしょうか?

私は知りません。
コーディングした人に聞いてください。

>ちなみに「\000」はstrtokで切り出せるのでしょうか?

区切る箇所以外に \ と 0 がないので
あればできると思います。

例えば、"aaa\000bbb\000ccc" を "aaa" と "bbb" と "ccc" に
分ける事はできますが
"aaa\000bbb\000c0c" を "aaa" と "bbb" と "c0c" と
分けるのは strtok() だけではできないと思います。



この投稿にコメントする

削除パスワード

No.4328

Re:ファイル処理「¥」について
投稿者---KEIT(2005/07/16 21:34:04)


>私は知りません。
>コーディングした人に聞いてください。

「,」が「¥000」になったということについてです。
ですのでコーディングした私もわかりませんとのことです。

>例えば、"aaa\000bbb\000ccc" を "aaa" と "bbb" と "ccc" に
>分ける事はできますが
そうやりたいのですが。
token_p = strtok(buf,"\000");
/
/
token_p = strtok(NULL,"\000");
とやっても2番目以降が切り出しできません。
token_pの中身が0x0になっていて、
値は\0になっています。


この投稿にコメントする

削除パスワード

No.4329

Re:ファイル処理「¥」について
投稿者---まきじ(2005/07/16 21:38:50)


>token_p = strtok(NULL,"\000");
>とやっても2番目以降が切り出しできません。
>token_pの中身が0x0になっていて、
>値は\0になっています。

文字列中の \ は \\ とする必要があります。
「エースケープ文字」を調べてみてください。


この投稿にコメントする

削除パスワード

No.4336

Re:ファイル処理「¥」について
投稿者---REE(2005/07/18 10:25:47)


>ここで本題なのですが、なぜそのような処理をしているのでしょうか?
>私はdata_check()ではデータチェックをしているだけなのですが、、、

data_checkの中で、strtokを使っていませんか?
strtokは、第一引数の内容を破壊します。
(strtokの第一引数にはconstが付いていません。
これは変更される可能性があることを表しています)
よって、必要があれば、strtokを使う前に、元の文字列を保存しておくか、コピーに対して処理する必要があります。

# ちなみに "\000"と"\0"は等価です。"\000"はデバッガでそう表現されただけでしょう



この投稿にコメントする

削除パスワード

No.4345

Re:ファイル処理「¥」について
投稿者---KEIT(2005/07/19 23:51:21)


>data_checkの中で、strtokを使っていませんか?
使っております。

>strtokは、第一引数の内容を破壊します。
>(strtokの第一引数にはconstが付いていません。
>これは変更される可能性があることを表しています)
関数についても確認させていただきました。
意図していないように変更されうるということですか?

>よって、必要があれば、strtokを使う前に、元の文字列を保存しておくか、コピーに対して処理する必要があります。
int data_check(char buf)
{

         char temp_buf[256];
         memset(temp_buf, 0, sizeof(temp_buf));
    
         temp_buf = buf;/* 先頭アドレスをコピー */
    
        /* 番号の切り出し */
        token_p = strtok(temp_buf, ",");


         return OK;
}




こう考えましたが、どうでしょうか?(退避がうまくいっていないと思うのですが、うまい方法ができなくて・・・)

># ちなみに "\000"と"\0"は等価です。"\000"はデバッガでそう表現されただけでしょう
謎ひとつ解決です。



この投稿にコメントする

削除パスワード

No.4351

Re:ファイル処理「¥」について
投稿者---RAPT(2005/07/20 00:12:10)


>> よって、必要があれば、strtokを使う前に、元の文字列を保存して
>> おくか、コピーに対して処理する必要があります。
>int data_check(char buf)
>{
>    char temp_buf[256];
>    memset(temp_buf, 0, sizeof(temp_buf));
>    temp_buf = buf;/* 先頭アドレスをコピー */
>    /* 番号の切り出し */
>    token_p = strtok(temp_buf, ",");
>    return OK;
>}

ポインタだけをコピーしても無意味です。
「文字列」をコピーするにはstrcpy()を使用します。

> 関数についても確認させていただきました。
> 意図していないように変更されうるということですか?
何を以って「意図していない」とするかによると思いますが、strtok()関数は、
引数文字列を変更するのが仕様なので、これを「意図していない」と表現する
のであれば、間違いです。



この投稿にコメントする

削除パスワード

No.4352

Re:ファイル処理「¥」について
投稿者---KEIT(2005/07/20 00:25:23)


文字列コピーですか。
修正しましたがなんかひっかかりますね。

int data_check(char *buf)
{

         char temp_buf[256];
         memset(temp_buf, 0, sizeof(temp_buf));
    
         strcpy(temp_buf,buf);
    
        /* 番号の切り出し */
        token_p = strtok(temp_buf, ",");


         return OK;
}







この投稿にコメントする

削除パスワード

No.4353

Re:ファイル処理「¥」について
投稿者---まきじ(2005/07/20 00:40:22)


>memset(temp_buf, 0, sizeof(temp_buf));

これは不要だと思います。

>return OK;

常に OK を返すのですか?
strcpy() とか strtok() 何の為にやったのでしょうか?


この投稿にコメントする

削除パスワード

No.4354

Re:ファイル処理「¥」について
投稿者---shu(2005/07/20 01:21:20)


一連のスレッドを見て、(質問の仕方・質問内容・IPアドレスなどより)、
恐らく同じ方が名前を変えて質問を繰り返しているんだろうなぁと思っております。

結果として、以下のソースのようなことがやりたいのだろうと勝手に判断・想像しました。
丸々ソースコードを載せることが良いかどうかはわかりませんが、
延々とあなたが製作?した、ご自分でも良く解っていないソースをいくら眺めたところで、
解りにくいものは解りにくく、質問の声も止む気配もありません。

過去ログになったところで、読み損してしまうようなスレッドになってしまいます。
その他諸々様々、今の気分もありまして、「一応わかりやすい」と思われるソースを書いてみました。

#include <stdio.h>
#include <stdlib.h>

struct student {
    int num;
    char name[32];
    int department, section, subsec;
};

#define IN_FILE    "data.txt"
#define IN_FORMAT    "%d,%[^,],%d,%d,%d"
#define OUT_FORMAT   "%d, %s, %d, %d, %d\n"
#define ERR_FORMAT   "%d行目のデータが正しく読みこめない\n"

#define DATA_ERROR   5

int main( void )
{
    FILE *fp = NULL;
    char buf[BUFSIZ] = "";
    struct student set;
    int data_check, i;
    
    fp = fopen( IN_FILE, "r" );
    if (fp == NULL) exit( 1 );
    
    for (i = 0; fgets( buf, sizeof buf, fp ); i++)
    {
        data_check = sscanf( buf, IN_FORMAT,
            &set.num, set.name, &set.department, &set.section, &set.subsec );
        
        if (data_check != DATA_ERROR) {
            fprintf( stderr, ERR_FORMAT, i );
            exit( 1 );
        }
        
        fprintf( stdout, OUT_FORMAT,
            set.num, set.name, set.department, set.section, set.subsec );
    }
    
    fclose( fp );
    
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity