トップページ⇒tech
1001コメント297KB

C言語なら、俺に聞け! <7>

■ このスレッドは過去ログ倉庫に格納されています
0001sageジョブスNGNG
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <6>
http://piza2.2ch.net/test/read.cgi/tech/999617524/
0577デフォルトの名無しさんNGNG
現在あるhogeディレクトリにはデータレコードファイルaaa.txtがあります。
それを消さずそのままで、bbb.txtファイルを作るにはどうすれば良いのでしようか?
結果として/hoge/の中に内容の同じaaa.txtとbbb.txtができるようにしたいのです。
環境はWindows95です。

Win32API関数を使わないで、出来ますでしょうか?
ただ、コマンドラインを使ってcopy aaa.txt bbb.txtを使うのは嫌だな。

よろしくお願いします。
0578もう一つなんすがNGNG
名前,出身地,仕事,趣味,
----------------------
山田,東京,エンジニア,車,\n
河田,神奈川,経理,音楽鑑賞,\n
ダイエル,神奈川,特殊部隊,音楽鑑賞,\n

このような可変長レコード(各データはカンマで区切られているだけで最大255文字と
いう以外は制約無し)のラインシーケンシャルのテキストデータファイルがあります。
このようなファイルを操作するに当たって、fseekのような関数を作りたいと思います。

�@ファイルポインタを○○行目に移動する関数を作るにあたって、何か妙案はありますか?

よろしくお願いします。
0579575NGNG
>>576
らじゃ。

私の場合、コンパイル時エラーの最大の要因はスペルミスです。ノリノリでコードを書いてると、よく
一文字順番が入れ替わったりするんで。リファクタリングしてるときには、コードまとめて Cut & Paste
だから間違いようがないんですけどね。

私はコンパイラが発見できるバグは怖くないと思ってるので、コンパイル時エラーはあまり気にして
ません。コンパイラが発見できないロジックミスの方は怖いので、assert() 埋めたり関数単体のテス
トは綿密にやります。


コードの行数を聞いたのは、この前呼んだ昔話(root から / へのメッセージ、だったかな?) が気に
なったからです。UNIX 黎明期の頃は CPU 利用時間で課金されていて、何度もコンパイルすると

- 金の無駄遣い

と言われたそうで。いまだと、そんな当時の常識は捨ててもいいよなと思ってて、それが背景にあっ
たので聞いてみた次第。
0580ことりんぐNGNG
聞きたいんですけど、Cygwinってどうなんでしょうか?
0581デフォルトの名無しさんNGNG
>>580
聞きたいんですけど、2ch てどうなんでしょうか?

……という質問と同じぐらい漠然としていて、なんとも答えようがないと思われ。用途や比較対象などを
もう少し絞り込んでみては?
0582ことりんぐNGNG
迷っているんですが、Linuxをインストールしようか、Cygwinで済まそうか迷っています。
実際、基本的なことを使えるようになりたいと思っているんですが、どうしたらいいんでしょうか?
Cygwinがどのへんまで同じ物なのかわかりませんし・・・
0583デフォルトの名無しさんNGNG
>>581
2ちゃんはヲタの集まり・・・

危険すぎる・・・
0584デフォルトの名無しさんNGNG
>>582
http://pc.2ch.net/test/read.cgi?bbs=unix&key=1003358904

ところで、なんでこっちスレに書き込んでるのか、
小一時間問い詰めさせてくれよ。
0585デフォルトの名無しさんNGNG
>>578
(n行->m Byte)の変換テーブルを作ればいいかと。
別にindexファイルを作るのが吉。
作れないなら、起動時にcsvファイルを全部読んだりして、
テーブルを作る必要がある。
0586デフォルトの名無しさんNGNG
>577
ANSIの関数はつかっていいんだよな?
aaa.txtとbbb.txtをfopen()で開いて、aaa.txtの内容を読み込んでbbb.txtに書いていけば。
fopen()はファイルがなければ、勝手に作ってくれる。
0587577=588NGNG
>>585
>(n行->m Byte)の変換テーブルを作ればいいかと。
>別にindexファイルを作るのが吉。

ありがとうございます。
Perlとかだと何行目っちゅうデータが簡単に取れるんですが、indexファイルですか。
頑張ります。

>>586
ありがとうございます。msdosだと、copyコマンドで簡単にファイルの複製ができますよね。
だからANSIの関数であるかと思ったんですが、見つけられずに立往生しておりました。
助かりました。

ありがとうございました。
0588デフォルトの名無しさんNGNG
ヌルポインタって、new で代入できないんですか?
0589デフォルトの名無しさんNGNG
new って?C++ の new?
0590588NGNG
Bingo!
0591デフォルトの名無しさんNGNG
>>582
Cygwinはカーネルがない
(Windowsの資源を流用。あえていえばcygwinのdllが)
0592__NGNG
複数の人が同時に同一ファイルを開く場合の
"速い安い旨い"アルゴリズムを教えて下さい。
0593__NGNG
ageeee
0594デフォルトの名無しさんNGNG
cache
0595デフォルトの名無しさんNGNG
>>592
それはアルゴリズムの問題じゃないと思う。
0596デフォルトの名無しさんNGNG
void foo(void)と
extern void foo(void)ってどう違うの?
またどう使い分けるの?
0597デフォルトの名無しさんNGNG
>>596
上は定義か宣言か、それだけじゃ区別つかない。
下は宣言。どこかに実体が定義されている、という宣言。
使い分けは、extern を書いたほうはヘッダにまとめる。くらいかな。
0598デフォルトの名無しさんNGNG
毎度っす、素朴(?)な疑問なんですが・・・
char szHostName[256];
とか文字列を格納する変数名の頭に付く『sz』とは何の略なんでしょうか?
0599デフォルトの名無しさんNGNG
String Zero-terminated
だっけ?
0600デフォルトの名無しさんNGNG
>>592
mmap、かなぁ。開くったって、同時に書き込みは出来ないわけだし。

>>598
Zero terminated String がどうこう、って話をその昔
聞いたことがありますが。
0601デフォルトの名無しさんNGNG
>>598
sz:string with zero terminated
'\0'で終了する文字列の略
0602デフォルトの名無しさんNGNG
>>598
「ハンガリアン記法」で検索してみるといいと思うよ。
0603598NGNG
>>599 600 601 602
みなさん、レスありがとうございました
0604デフォルトの名無しさんNGNG
関数で引数を省略化な関数を作りたいのですが、
宣言とかどうすればよいのでしょう。

教えてください。
0605デフォルトの名無しさんNGNG
>>604
C++ だけど、

int func(int n = 0){
return n;
}

とすれば、func() なら 0 が返るし、func(777) なら 777 が返る。
0606デフォルトの名無しさんNGNG
>>604
man stdarg
0607デフォルトの名無しさんNGNG
>>604

void f(int x, ...)

どうにかして引数の数を得なければいけないけど
(printfみたいな書式指定でも、個数を指定してもok)
0608デフォルトの名無しさんNGNG
>>607
man stdarg or varargs.h
0609604NGNG
>>605さんの方法で、
ヘッダの宣言のほうで
int func(int n = 0);

ソースのほうは
int func(int n)
{}
でいけました。

ありがとうございました。
0610604NGNG
あ、ちなみにC++です。
0611デフォルトの名無しさんNGNG
>>609
....
0612デフォルトの名無しさんNGNG
ガーン、可変引数の話じゃなかった(ウトゥ
0613名無しさんNGNG
エクセルで作成したCSVファイルのデータを
入出力したり、演算したデータを書き込む操作をVBAの
他にもC/C++で処理してみたいのですが、参考になる
プログラムまたはサイトはありませんか?
因みにCのコンパイラはBorland社のフリーソフトです。
0614sageNGNG
誰か激しく突っ込んでやれよ! >>597
0615デフォルトの名無しさんNGNG
自作ヘッダ作りました
↓
クソヘッダが出来ました
↓
ヘッダ作るのヘッダクソやなあ

学校の宿題で「C言語イレギュラーを考えて来い」とのお達し。
これでいきたいと思います。
0616デフォルトの名無しさんNGNG
>>613
ググールいって
csv open close #include
で検索するのはどうか
0617デフォルトの名無しさんNGNG
>>596
staticで宣言されてないなら、Cの関数は外部リンケージをもつから
どっちでもいっしょ。お好きなほうをどうぞ。
0618デフォルトの名無しさんNGNG

すいません。下のソースをコンパイルするとエラーが出ます。
なんででしょうか。教えて下さい。。。。
#include <stdio.h>

void nfunc(char *s){
char k = *(s);
*(s) = *(s+1);
*(s+1) = k;
return;
}
main()
{
//int i;←ここだとOK。
char x[7] ="tinnpo";
nfunc(x);
int i;//←ここだとだめ。
for (i=0;i<50;i++){
printf("%s",x);
}
}
0619デフォルトの名無しさんNGNG
>>618
変数はブロックの先頭でしか宣言できません。何故かと問われても、そういう決まりですとしか。
0620デフォルトの名無しさんNGNG
以下のプログラム実行したとき
たとえば変数aにhogehogeと入力したとき
input:input:input:
とループしてしまいます
これをループしないようにするには
どうしたらよいのでしょうか?
int a;

while(1){
printf("Input:");
a=getchar();
if(a=='1'){
break;
}
}
0621デフォルトの名無しさんNGNG
>>619
即レスありがとうございます!
すると変数宣言を全部頭に固めとけってことですね。
0622デフォルトの名無しさんNGNG
>>620
while(1){
って条件が常に真で無限ループですよね。
んで"hoge"!=1だから抜けないんじゃ。。。。
0623デフォルトの名無しさんNGNG
>>620
どうしてループするのかわからないならここで訊く前にK&Rを死ぬほど読め。
0624デフォルトの名無しさんNGNG
あ、intに文字を代入してるのか。。。?
0625デフォルトの名無しさんNGNG
getchar()は1文字入力専用なので、コンソールに1文字以上の
バッファがたまっていると、バッファを吐き出すまで、コンソール
入力が無くても値を返してきます(自動的に関数が終了してしまう)
多分、>620の関数だと、文字列数+1の「input:」を画面に
出力されるのではないでしょうか?

多分と思われる正解は

#include <stdio.h>
#include <string.h>

main(){
char buf[BUFSIZ];
while(1){
printf("Input:");
gets(buf);
if( strcmp( buf, "end" ) == 0 ){
break;
}
}
}
こうかな?
0626620NGNG
>>622,623
レスありがとうございます

質問の仕方がわるかったみたいです
わざとhogeとか入力して
ループするようにしたとき
ループするのが1回ではなくて
input:input:
と複数回ループしてしまうのは
どうしてですか?
0627デフォルトの名無しさんNGNG
プログラムを勉強しようと思ってます。
ゼロからなのですが、まずC言語とやらを学ぶのがいいんですか?
教えてください。
0628622NGNG
>>625
うげ、わけわからんレスしてすいません。。。逝って来ます。
0629デフォルトの名無しさんNGNG
>>626
なんで1回しかループしないと思うのか。
どうしてループするのかわからないならK&Rを死ぬほど読め。
0630デフォルトの名無しさんNGNG
#include <stdio.h>

int main(void)
{
int sintyou;
int taijyuu;
double meter_sintyou;
double bmi;

printf("身長入れてください>");
scanf("%d,&sintyou");

printf("体重を入れてください>");
scanf("%d,&taijyuu");

meter_sintyou=/100.0;
bmi=taijyuu/(meter_sintyou*meter_taijyuu);

printf("あなたのBMI指数は%fです\n",bmi);

printf("判定:")
if(bmi<18.5){
printf("やせすぎだYO\n");
}else if(bmi<25){
printf("標準体重\n");
}else if(bmi<30){
printf("ちょっと肥満\n");
}else{
printf("デブ\n");
}

   return 0;

}

なんか完璧なのにエラーがでるのだけど、どう書き換えたらいいかな?修正してください
0631デフォルトの名無しさんNGNG
scanfを調べなおせ
0632デフォルトの名無しさんNGNG
>>631 書きかえてもらえませんか?
0633デフォルトの名無しさんNGNG
meter_sintyou=/100.0;
なんてネタだな。
0634デフォルトの名無しさんNGNG
meter_taijuuって何だよ〜
結果がおかしいとか以前に、これじゃコンパイル通らないぞ。
0635デフォルトの名無しさんNGNG
C言語体当たり学習の本を写したんですけどね〜?
0636デフォルトの名無しさんNGNG
指摘された個所と本のソースを読み比べろ。
0637デフォルトの名無しさんNGNG
ありがとうございました、とりあえず今からログ保存してきます。
正解も書いてくれませんか?間違えと見比べるので。お願いします
0638デフォルトの名無しさんNGNG
>>637 よ
>>1 の "課題丸投げなら別スレにいけ。" の一文がも前には目に入らないのか?
0639遭難中NGNG
ちょっと助けてください。

struct bodyStr readbody(int i){
struct bodyStr body;
int t;
scanf("%s%s%s%s%s%s%s%s%s%s%s",
body.size.height,body.size.neck,body.size.arm,body.size.waist,body.size.inseam,
body.color.hair,body.color.eyes,body.color.skin,body.shape,body.age,body.sex);
temp.number=(t+1 ? ++i : 0);
return body ;
}

なんですが、プログラムがここにかかると止まります。
原因はなんでしょうか?
もしかして、ここが原因ではない?
0640遭難中NGNG
temp.number=(t+1 ? ++i : 0);
ではなく
body.a=(t+1 ? ++i : 0);
の書き間違えでした。
でもプログラムは止まります。
0641デフォルトの名無しさんNGNG
>>639
body.size.heightとか、scanfに渡してる変数は、char*になってるか?
数値型だと、動かんよ。

つか、scanfをこんな使い方したら、正しく動いても、ミスらないで入力
するのは至難のワザ。
(リダイレクトで入力すんのか?)
0642デフォルトの名無しさんNGNG
>>639
あと
scanf("%s %s %s %s %s %s %s %s %s %s %s",
%s の間にスペース入れないと、ダメっぽい。
0643デフォルトの名無しさんNGNG
先に>>641で指摘されてしまったので、もいっこ。
関数内に出てくる t が初期化されてないけど大丈夫?
何が入ってるか分からないよ。
0644遭難中NGNG
指摘いただいたとこ直したのですが駄目です。

プログラム全部のせて指摘していただきたいのですが、そうしたら、丸投げになってしまうし、
どうすれば〜(泣)
0645遭難中NGNG
http://popup.tok2.com/home/tnao/10-30.c.txt
0646デフォルトの名無しさんNGNG
えっと、すっごい基本的な質問しますけど、body.size.heightってintとかの整数値
ですか?%sはNULLまでを表示する型指定なので、もし数値を表示したいのであれば、
%dで書かなきゃランタイムエラーでますぜ。
0647646NGNG
お、ソース上がってるね。チョい確認してくるわ
0648遭難中NGNG
お願いします
0649643NGNG
ソースをちょっとだけ見てみたよ。
main()の最初でいきなりiが初期化されてないよー。

初期化してない変数は0が入るのだと勘違いしてるのかも知れないけど、
関数内で定義した変数の初期値は「不定」だからね。
0が入ってるかも知れないし-1000かも知れないし256かも知れない。
0650遭難中NGNG
指摘ありがとうございます。
しかし結果はかわらず・・・。
0651646NGNG
iもnumもだな
現在確認中
0652遭難中NGNG
再アップしました。

ちな次のようなプログラムを作れ。
(1)洋服用身体データ構造体を定義する。タグ名をbodyStrとする。
識別番号
サイズ: 身長, 首回り, 腕の長さ, 胴回り, 足の長さ
色 : 髪, 目, 肌
体型 :値を(太め,標準,細め)の3種類とする。
年齢
性別
識別番号以外のデータは文字列に入れる。文字配列のサイズは(データを見て)適当に決
める。
(2)その構造体の配列を用意する。配列のサイズは全部のデータが収容出来るだけとする
。
(3)データを一人分読む関数readBodyとデータを一人分書くwriteBodyを書く。readBodyは
bodyStr
構造体を戻し,writeBodybodyStr構造体を引数に取るものとする。 みに今回のこの問題は
0653643NGNG
main()の最初で定義してるstruct bodyStr *bodyの指してる先がないぞ。

未初期化ポインタをdo {} while()の終了条件の中で参照してるから、
readbodu()から正しく戻ってきてもここで死にますな。
0654遭難中NGNG
という、課題なんです。
どうも実行がうまくいかなくて・・・。
0655遭難中NGNG
なるほど!ちょっといじってみます。
ありがとうございます。
0656遭難中NGNG
struct bodyStr body[20];


do{
body[i]=readbody(num);
}while(body[i++].a);

if(argc-1){
writebody(body[(argv[1])-1]);}
else
for(j=0; j<i-1; j++)
writebody(body[j]);

指摘個所をこのように変えてみました。
dataを破棄しました。これを実行したら、PC自体がフリーズしてしまいました、
0657デフォルトの名無しさんNGNG
643は責任もって最後まで教えてやれよ。
0658646NGNG
うんと、これの入力はコンソール入力でいいの?
それともファイルとかの外部入力なの?
0659遭難中NGNG
リダイレクションです。

それ用のファイルは
http://popup.tok2.com/home/tnao/body.dat.txt
です。
コマンド行に番号が指定されていれば、その識別番号のデータを出力するようにして、
なにも指定がなかったら全部のデータを出力するようにします。
a.out 3 <body.dat
または
a.out <body.dat
と入力するんです。
0660デフォルトの名無しさんNGNG
readbody(num)のnumはループ内のどこで変更されている?
0661デフォルトの名無しさんNGNG
それと readbody 内の t は常に 1 じゃない?
無限ループかつ data[i] によってデータ破壊されてると思われ。
0662遭難中NGNG
PCがフリーズしまくる原因はこれなんでしょうか…。
改善策を教えていただきたいのですが…
0663遭難中NGNG
どうしたらいいんでしょうか?
0664デフォルトの名無しさんNGNG
読み込み時の終了条件を考えてみ。
0665デフォルトの名無しさんNGNG
body.a=(t+1 ? ++i : 0);
これ、処理を分解して、もっと分かりやすくしようよ。
0666デフォルトの名無しさんNGNG
>>656
>writebody(body[(argv[1])-1]);}
writebody(body[atoi(argv[1])-1]);}

# だんだんlisp化してきてるな...
# > body[i]=readbody(num); は絶対に俺には思いつかん...
0667デフォルトの名無しさんNGNG
もっと素直にかけ・・・
0668デフォルトの名無しさんNGNG
C言語でコンソールメールクライアント作ってちょ。
できればLinxu用のシンプルなやつお願いします。
SubjectとBodyがあればそれだけで十分です。
実用性と勉強を兼ねて吟味したいのです。
0669デフォルトの名無しさんNGNG
作ってちょて、アンタ・・・
0670デフォルトの名無しさんNGNG
>>668
UCB Mail とか MH のソース読めよ。

仕事として依頼するなら最低で 0.5 人月要求するが?
0671デフォルトの名無しさんNGNG
遭難中は、プログラムに処理内容を説明するコメントをつけてみたらどうか。
0672遭難中NGNG
今頑張ってますが、atoiを入れると、コンパイルがエラーになります。
回避の方法はどうしたらいいんでしょう?
0673デフォルトの名無しさんNGNG
コンパイルエラーだけじゃわからん。
0674デフォルトの名無しさんNGNG
むむっ誰かお創りになった方はいないのですか?
そんなに複雑なものでなくていいのです。
例えば100行のブラウザのような本当に基本的なものでよかったのですが・・・・
とりあえずありがとうございました。おさがわせいたしました。
0675デフォルトの名無しさんNGNG
文字列を入力するときは
 gets(s);
なのに、なんで1文字を入力するときは
 s=getchar();
なんですか?
 getchar(s);
ではだめなんですか?
0676デフォルトの名無しさんNGNG
data[i]=readbody(num);
そもそもこれがうまく動かないだろう・・・
関数struct bodyStr readbody(int i)の最後で
return body;
とやっても、関数struct bodyStr readbody(int i)内の
struct bodyStr body;
のアドレスがdata[i]に代入されるだけで、このアドレスの指す
データは関数struct bodyStr readbody(int i)が終了するとともに
消滅してしまうからね
■ このスレッドは過去ログ倉庫に格納されています