ページ 1 / 1
途中からの読み込み
Posted: 2010年7月13日(火) 12:24
by 秋色
こんにちは。
テキストファイルを読み込むものを作っているのですが…。
テキストに
田中 40 男
木村 28 男
中村 32 女
とある場合、名前の後から読み込んだり途中から
読み込むことってできますか??

Re:途中からの読み込み
Posted: 2010年7月13日(火) 14:07
by だいちゃん
やったことないんでわかりませんが
なんで途中から読み込ませたいんですか?
頭から読み込んでも使いたいとこ以外は読み飛ばせば問題ないのでは?
Re:途中からの読み込み
Posted: 2010年7月13日(火) 15:28
by 秋色
そうなんですが、読み飛ばしなしでできないかと思って…。
後、下記のプログラムで、実行すると不正命令検出って言われて
終わってしまうのはなぜですか??どこが間違えてるのか指摘お願いします。
#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);
}
Re:途中からの読み込み
Posted: 2010年7月13日(火) 15:54
by softya
ファイル内の読み込み位置(ファイル先頭からのバイト数)が分かっているのなら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:途中からの読み込み
Posted: 2010年7月13日(火) 20:37
by 秋色
直してみました。でも、やっぱ2番目の年齢を格納するところが
上手くいかないです。

Re:途中からの読み込み
Posted: 2010年7月13日(火) 21:31
by dic
修正してみました
配列のインデックス値がおかしかったりしてます
ファイルをオープンするのはきめうちにしてます
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);
}
Re:途中からの読み込み
Posted: 2010年7月13日(火) 21:33
by box
> unsigned Filename[20];
ファイル名がint型でよいのでしょうか。
Re:途中からの読み込み
Posted: 2010年7月13日(火) 21:54
by 白い時空
こういう入力はsscanf関数使ったほうが簡単です。
while(fgets(str, MAX, fp) != NULL){
sscanf(str,"%s %lu %s",list[j].name,&list[j].age,list[j].sex);
j++;
}
これだけで済みます。
Re:途中からの読み込み
Posted: 2010年7月13日(火) 22:28
by 秋色
どなたもありがとうございます。
ですが、動かなかったです…。すみません。
Re:途中からの読み込み
Posted: 2010年7月14日(水) 00:04
by みつ
これを試してみてください。
for (i = 0; fscanf(fp, "%s %d %s", list.name, &list.age, list.sex) != EOF; i++);
Re:途中からの読み込み
Posted: 2010年7月14日(水) 07:41
by 秋色
どこに入れたらいいですか??
Re:途中からの読み込み
Posted: 2010年7月14日(水) 11:35
by 秋色
解決できました。ありがとうございます。
経過日時を計算する方法
Posted: 2010年7月25日(日) 20:15
by 釣り師
お久しぶりです。
今時計作りの一環としてある日付からどのくらい経過したか表示してみたいと思ったのですが、どうしたらいいかわかりません。
例えば、今日は2010年7月25日です。そして、時間が経過して2010年8月25日になったとします。
そして、2010年8月25日現在の時計の画面に「1ヶ月経過」と表示してみたいのです。翌日には「1ヶ月と1日」というふうに…。
今作っている時計に実装するかはわかりませんがこういうことが出来ると面白いものになりそうなので、どなたか教えていただけないでしょうか。
使っているのはVisual C++ 2010
DxLib使用です。
それと、APIのような高度なものはさっぱり理解出来ていません…。
よろしくお願いします。
Re:経過日時を計算する方法
Posted: 2010年7月25日(日) 20:27
by シエル
基準となる日付をファイルに保存しておいて、
毎回起動するたびに、そいつを読み込みにいって、現在の日付との差を出して
表示するだけでいいと思いますよ。
Re:経過日時を計算する方法
Posted: 2010年7月25日(日) 20:42
by 釣り師
シエルさん。
>現在の日付との差を出して表示するだけでいいと思いますよ。
しかし、7月25日と8月15日との差って、8-7=1、15-25=-10
で日付の方はうまく計算されませんよね?そうしたらいいのでしょう
Re:経過日時を計算する方法
Posted: 2010年7月25日(日) 20:51
by シエル
答えを言おうかと思ったけどやっぱやめます。
ちょっと考えればできますよ。
ググるなりして、ちょっと頑張ってみましょう。
Re:経過日時を計算する方法
Posted: 2010年7月25日(日) 21:19
by 釣り師
う~ん。いくつかのサイトの解説を見つけて読んでみましたが、さっぱり理解できませんでした。
解説、ソース見たんですけどさっぱり。
Re:経過日時を計算する方法
Posted: 2010年7月25日(日) 21:49
by シエル
一ヶ月って何日でしたっけ?
月って30日だったり、31日だったっりしたっけ?
うるう年って何だっけ?
Re:経過日時を計算する方法
Posted: 2010年7月25日(日) 21:54
by MNS
自分で計算するのが億劫ならば、標準ライブラリに含まれるヘッダである、
<time.h>の関数群を駆使することによって、経過日時を得ることも可能です。
difftime関数
localtime関数
mktime関数
あたりでしょうか。
Re:経過日時を計算する方法
Posted: 2010年7月26日(月) 19:03
by 釣り師
閏年を判別するまではいけたんですが…。
別問題が発生して…。
なので、別にトピを作り質問しました。
また、解決し、新たな疑問ができ次第質問させて頂きます。
ありがとうございます。
http://www.play21.jp/board/formz.cgi?ac ... &rln=57508