途中からの読み込み

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
秋色

途中からの読み込み

#1

投稿記事 by 秋色 » 15年前

こんにちは。
テキストファイルを読み込むものを作っているのですが…。

テキストに
田中 40 男
木村 28 男
中村 32 女

とある場合、名前の後から読み込んだり途中から
読み込むことってできますか??
画像

だいちゃん

Re:途中からの読み込み

#2

投稿記事 by だいちゃん » 15年前

やったことないんでわかりませんが
なんで途中から読み込ませたいんですか?
頭から読み込んでも使いたいとこ以外は読み飛ばせば問題ないのでは?

秋色

Re:途中からの読み込み

#3

投稿記事 by 秋色 » 15年前

そうなんですが、読み飛ばしなしでできないかと思って…。

後、下記のプログラムで、実行すると不正命令検出って言われて
終わってしまうのはなぜですか??どこが間違えてるのか指摘お願いします。

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

#define MAX 100
#define ITEM 5

struct meibo{
 char name[20];
 int age;
 char sex[5];
};

void main(void){
 FILE *fp;
 char filename[20];
 char str[MAX];
 int i, j;
 struct meibo list[5];
 
 printf("ファイル名を入力>>");
 gets(filename);

 if((fp = fopen(filename, "r")) == NULL){
  printf("ファイルがありません\n");
  exit(1);
 }

 while(fgets(str, MAX, fp) != NULL){
  for(j = 0; j < ITEM; j++){
   for(i = 0; str != ' '; i++){ 
    list[j].name = str;
   }
   for(i = i+1; str != ' '; i++){
    list[j].age = str;
   }
   for(i = i+1; str != '\0'; i++){
    list[j].sex = str;
   }
  }
 }
 for(j = 0; j < ITEM; j++){
  printf("%s %d %s\n", list[j].name, list[j].age, list[j].sex);
 }
 fclose(fp);
}

softya

Re:途中からの読み込み

#4

投稿記事 by softya » 15年前

ファイル内の読み込み位置(ファイル先頭からのバイト数)が分かっているのならfseek()で読み飛ばしができます。ただし、その位置を調べるにはファイルを一度開いて読み込んだときにftell()で読み込み位置を調べる必要がありますね。

>後、下記のプログラムで、実行すると不正命令検出って言われて

1.文字列の終端は'\0'で終わる必要があります。
2.list[j].age = str;は、左が数値で右が文字列ですので根本的に間違っています。
3.ITEMで5個と行数を固定してますが、実際にファイルも5行のデータですか?
もし、違ったらITEMで5で固定するのは間違いです。
4.while(fgets(str, MAX, fp) != NULL){とfor(j = 0; j < ITEM; j++)がループとして別になっているのでが変です。ファイルの行数掛けるITEM数分処理するんでしょうか?

秋色

Re:途中からの読み込み

#5

投稿記事 by 秋色 » 15年前

直してみました。でも、やっぱ2番目の年齢を格納するところが
上手くいかないです。 画像

dic

Re:途中からの読み込み

#6

投稿記事 by dic » 15年前

修正してみました
配列のインデックス値がおかしかったりしてます
ファイルをオープンするのはきめうちにしてます
memset でゼロクリアしてます
デバッカでバグを追っていく辛抱強さが必要です
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>        //    memset に必要

#define MAX 20
#define ITEM 5

struct meibo{
    unsigned char name[20];
    unsigned long age;
    unsigned char sex[5];
};

void main(void){
    FILE *fp;
//    char    Filename[20];
    char str[MAX];
    unsigned long i, a, j = 0;

    char    age[20];

    struct meibo list[ITEM];
    memset( list, 0, sizeof(list) );                                    //    内容をゼロでクリアしておく

    //    ファイルをオープン(きめうち)
    fp = fopen( "test.txt", "rt" );

    while(fgets(str, MAX, fp) != NULL){
        for(i = 0; str != ' '; i++){
            list[j].name = str;
        }
        list[j].name = '\0';
        memset( age, 0, sizeof(age) );                                    //    age をゼロでクリア
        for(i = i+1,a=0; str != ' '; i++,a++){                        //    インデックスがおかしい
//        for(i = i+1; str = ' '; i++){
            age[a] = str;
//            list[j].age = atoi(str);
        }
        age[a] = '\0';
        list[j].age = atoi(age);                                        //    文字列をatoi
//        list[j].age = '\0';
        for(i = i+1,a=0; str != '\0'; i++,a++){
//        for(i = i+1; str[i] != '\0'; i++){    
            list[j].sex[a] = str[i];                                    //    list[j].sex[a] 配列がおかしい
//            list[j].sex[i] = str[i];
        }
        list[j].sex[i] = '\0';
        j++;
    }
    for(i = 0; i < j; i++){
        printf("%s %lu %s", list[i].name, list[i].age, list[i].sex);    //    \n はしょり
//        printf("%s %lu %s\n", list[i].name, list[i].age, list[i].sex);
    }
    fclose(fp);
}

box

Re:途中からの読み込み

#7

投稿記事 by box » 15年前

> unsigned Filename[20];

ファイル名がint型でよいのでしょうか。

白い時空

Re:途中からの読み込み

#8

投稿記事 by 白い時空 » 15年前

こういう入力はsscanf関数使ったほうが簡単です。
while(fgets(str, MAX, fp) != NULL){
    
    sscanf(str,"%s %lu %s",list[j].name,&list[j].age,list[j].sex);
    j++;
}
これだけで済みます。

秋色

Re:途中からの読み込み

#9

投稿記事 by 秋色 » 15年前

どなたもありがとうございます。
ですが、動かなかったです…。すみません。

みつ

Re:途中からの読み込み

#10

投稿記事 by みつ » 15年前

これを試してみてください。

for (i = 0; fscanf(fp, "%s %d %s", list.name, &list.age, list.sex) != EOF; i++);

秋色

Re:途中からの読み込み

#11

投稿記事 by 秋色 » 15年前

どこに入れたらいいですか??

秋色

Re:途中からの読み込み

#12

投稿記事 by 秋色 » 15年前

解決できました。ありがとうございます。

釣り師

経過日時を計算する方法

#13

投稿記事 by 釣り師 » 15年前

お久しぶりです。
今時計作りの一環としてある日付からどのくらい経過したか表示してみたいと思ったのですが、どうしたらいいかわかりません。

例えば、今日は2010年7月25日です。そして、時間が経過して2010年8月25日になったとします。
そして、2010年8月25日現在の時計の画面に「1ヶ月経過」と表示してみたいのです。翌日には「1ヶ月と1日」というふうに…。
今作っている時計に実装するかはわかりませんがこういうことが出来ると面白いものになりそうなので、どなたか教えていただけないでしょうか。

使っているのはVisual C++ 2010
DxLib使用です。
それと、APIのような高度なものはさっぱり理解出来ていません…。

よろしくお願いします。

シエル

Re:経過日時を計算する方法

#14

投稿記事 by シエル » 15年前

基準となる日付をファイルに保存しておいて、
毎回起動するたびに、そいつを読み込みにいって、現在の日付との差を出して
表示するだけでいいと思いますよ。

釣り師

Re:経過日時を計算する方法

#15

投稿記事 by 釣り師 » 15年前

シエルさん。
>現在の日付との差を出して表示するだけでいいと思いますよ。

しかし、7月25日と8月15日との差って、8-7=1、15-25=-10
で日付の方はうまく計算されませんよね?そうしたらいいのでしょう

シエル

Re:経過日時を計算する方法

#16

投稿記事 by シエル » 15年前

答えを言おうかと思ったけどやっぱやめます。
ちょっと考えればできますよ。
ググるなりして、ちょっと頑張ってみましょう。

釣り師

Re:経過日時を計算する方法

#17

投稿記事 by 釣り師 » 15年前

う~ん。いくつかのサイトの解説を見つけて読んでみましたが、さっぱり理解できませんでした。
解説、ソース見たんですけどさっぱり。

シエル

Re:経過日時を計算する方法

#18

投稿記事 by シエル » 15年前

一ヶ月って何日でしたっけ?
月って30日だったり、31日だったっりしたっけ?
うるう年って何だっけ?

MNS

Re:経過日時を計算する方法

#19

投稿記事 by MNS » 15年前

自分で計算するのが億劫ならば、標準ライブラリに含まれるヘッダである、
<time.h>の関数群を駆使することによって、経過日時を得ることも可能です。

difftime関数
localtime関数
mktime関数
あたりでしょうか。

釣り師

Re:経過日時を計算する方法

#20

投稿記事 by 釣り師 » 15年前

閏年を判別するまではいけたんですが…。
別問題が発生して…。
なので、別にトピを作り質問しました。

また、解決し、新たな疑問ができ次第質問させて頂きます。

ありがとうございます。

http://www.play21.jp/board/formz.cgi?ac ... &rln=57508

閉鎖

“C言語何でも質問掲示板” へ戻る