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

【初心者歓迎】C/C++室 Ver.47【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/01/16(水) 15:14:51
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.46【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1198755167/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん2008/01/16(水) 15:16:07
>>1
乙
0003デフォルトの名無しさん2008/01/16(水) 15:56:00
引数を取る関数一般の話として、
同じ引数で何度も呼び出しても毎回返値が違う可能性がありますよね。
time()とか。

もし、ある関数に対して「同じ引数ならば常に同じ値を返し、かつ副作用が無い」ことをコンパイラに対して表明できれば、
あるケースにおいては最適化に有利だと思うのですが、
何らかの方法でそれをコンパイラに表明することはできますか?

int f(int x){return x+1;} //同じxに対して同じ値を返す
int main(){
for(int i=0; i<f(99); i+=f(0)) printf("%d", f(1)); //最適化可能?
return 0;
}
0004デフォルトの名無しさん2008/01/16(水) 16:04:20
>>3
定数を返す関数ならVC8などで関数がインライン化されてしまう
事はあるが、引数によって戻り値が違う場合は難しいかも。
0005デフォルトの名無しさん2008/01/16(水) 16:05:16
>>3
副作用がないことの表明にはならないけれど、C++のinlineはコンパイラにインライン展開を促す
000632008/01/16(水) 16:11:14
たとえば>>3のf()がやたら複雑な計算を要する場合とか、
たとえ同じ引数に対して常に同じ値を返すとしても、
インライン展開では毎回計算してしまうんですよね?

やはり自分で一時変数を確保しておくのが良いということですか
0007デフォルトの名無しさん2008/01/16(水) 16:14:01
賢いコンパイラならそこを最適化できるかもしれないが、
そうでないコンパイラを使うなら、自前でキャッシュを持てばいいだろう。
0008デフォルトの名無しさん2008/01/16(水) 16:14:41
>>6
引数の取る数が限られている場合はテーブル展開するのが常識。
引数が実数だとそうは行かないが。
0009デフォルトの名無しさん2008/01/16(水) 16:17:32
例えばアッカーマン関数のような何度も同じ整数のペアが
出てくるような再帰的な関数の場合、整数のペアをstd::pairに
入れてキーにしてstd::mapに入れれば劇的に速くなる。
0010デフォルトの名無しさん2008/01/16(水) 16:26:44
次の全ての条件に当てはまる関数を一意的な関数と呼ぶ
・グローバル変数を参照しない
・ローカルstatic変数を持たない
・間接参照を用いてローカル変数以外の変数を参照しない
・初期化していない変数の値を返さない
・他の一意的でない関数を呼ばない

こんな感じか
0011デフォルトの名無しさん2008/01/16(水) 17:01:31
C/C++は余計なことしないからなあ
memoizeは自分で処理しないといけない
0012デフォルトの名無しさん2008/01/16(水) 17:04:05
アセンブラじゃあ開発期間が長すぎる or 開発不可能な
プロジェクトをアセンブラにあまり劣らない速度を保ちつつ
開発を可能にしたのがC/C++

他の言語は必ずどこかで速度や効率を犠牲にしている
0013デフォルトの名無しさん2008/01/16(水) 17:34:41
あ
0014デフォルトの名無しさん2008/01/16(水) 18:03:14
constexpr待ちsage
0015デフォルトの名無しさん2008/01/16(水) 18:32:40
>>3
__declspec(noalias)とか__attribute__((const))とかないわけではない。
0016デフォルトの名無しさん2008/01/16(水) 18:45:59
前スレ995です。
zlib.hはたぶん大丈夫だと思います。この前には
zlib.hが見つからないってエラーが出てたんですが
どっかのディレクトリにあったzlib.hを/usr/includeに
持ってきたらエラーは消えて現在に至る、と言うかんじです。

glutが足りないんでしょうか。Synapticで
lib-glut3
lib-glut3-dev
glut3
glut3-dev
freeglut3
freeglut3-dev

とかは入れたのですが。。。まだ他に入れなければいけないパッケージが
あるということでしょうか。
0017デフォルトの名無しさん2008/01/16(水) 18:50:25
zlibのバージョンは?
glutが使ってるzlibが足りないとみたんだが。
gzFileはzlibで定義されてるはず
0018デフォルトの名無しさん2008/01/16(水) 18:51:24
つーか、どっかのディレクトリにあったのを自分でコピーするって、、
ちゃんとインストールしてないんじゃないの?
0019162008/01/16(水) 18:58:46
findで調べてみたら
/usr/src/linux-headers-2.6.22-14/include/linux/zlib.h
にあったのでこれを取ってきたのですが・・・
するとエラーが消えたのでこれでいいのかな、と思ったのですが・・

ちゃんとsynapticなりでインストールしなきゃいけないということでしょうか。
0020デフォルトの名無しさん2008/01/16(水) 19:07:40
>>19
そのzlib.hの中に gzFile の定義なかったらハズレ。ちゃんとzlibをイ
ンストールしましょう。
そもそも、ヘッダだけコピーしてもライブラリがなきゃリンクできない
じゃない。
0021162008/01/16(水) 19:20:25
なるほど。。お恥ずかしい限りです。Synapticでzlibっぽいのをインストールしたところ
とりあえずエラーは消えました。ただ
/tmp/ccqSOFll.o: In function `readfile':
cv109.c:(.text+0xa41d): undefined reference to `gzopen'
cv109.c:(.text+0xa5ce): undefined reference to `gzgets'
cv109.c:(.text+0xa5e4): undefined reference to `gzclose'
というエラーが出てしまって…GLUTのライブラリを読み込めていないということでしょうか。
Synapticで
freeglut3
glut
libglut
関連は入れてるので多分大丈夫だと思うのですが。。。

コンパイルするコマンドは
gcc -lglut -lGLU -lGL cv109.c
でいいのでしょうか?
0022デフォルトの名無しさん2008/01/16(水) 19:41:50
-lz
0023デフォルトの名無しさん2008/01/16(水) 19:53:09
#include <iostream>

int main(){
  int x = 10;
  float f = 5.5;
  const int& r = (int)x, &s = (int)f;
  x = 8;
  f = 1.00;
  std::cout << x << ',' << r << std::endl;
  std::cout << f << ',' << s << std::endl;
  return 0;
}
実行結果
8,8
1,5

同じキャストでも元の型と同じ型にキャストすると変数自体へのリファレンス、
違う型にキャストすると一時値へのリファレンスになります。
(int)xの方は最適化が働いているんだろうと思いますが、
このように同じキャストでも結果が違うのは仕様に準拠したものでしょうか?
コンパイラはbccです。
0024162008/01/16(水) 20:09:37
-lz をつけると問題なく動きました。ありがとうございます。
お手数をお掛け致しましたm(_ _)m
0025デフォルトの名無しさん2008/01/16(水) 20:48:20
while(条件){
 処理
 if(条件)
  構造体の宣言を新しく追加 //例えばkouzoutai hoge[0]、hoge[1]、hoge[2]…
}

ってしたいんだけどどうやって書けばいいの?
0026デフォルトの名無しさん2008/01/16(水) 20:50:06
>>3
>>14 の言ってる constexpr ってのが次期 C++ に入る予定。
関数の戻り値をコンパイル時に定数にできる。
ただし、return 文しかない関数じゃないとダメだけど。

あるいは、今でもテンプレート引数と静的メンバ定数を利用して
似たような物を作る事もできる。

複雑な事やろうとしたら再帰するしかない。
制御文も使えないけど、? : は使えるから意外と色々出来るよ。
0027デフォルトの名無しさん2008/01/16(水) 20:53:38
>>25
宣言は追加できません。配列の要素数を増やしたいなら、std::vectorでも使えばよろしいかと。
0028デフォルトの名無しさん2008/01/16(水) 20:56:19
>>23
同一の型へのキャストはno effectだったという記憶があるような
ないような。
0029デフォルトの名無しさん2008/01/16(水) 20:57:18
>>27
ありがとう。そうすることにします
0030デフォルトの名無しさん2008/01/16(水) 20:57:37
>>23
つまり最適化ではなく、標準どおりかと
思うような思わないような。
0031デフォルトの名無しさん2008/01/16(水) 21:04:56
前スレからの続きのunary_functionに関する質問です。
入力
string line = "11 22 33 44";
char delim = ' ';
出力
vector<int> v ← 11,22,33,44 (要素4個のベクタ)
という関数をつくろうとして、それはできたのですが、次に
stringからintへ変換するunary_functionを引数で渡して(1)、上記関数内で
transform()に渡そう(2)としたのですが、上手くいきません。前スレで教えてもらって
(1)の引数で渡すところまではできたのですが、(2)のtransformに渡す所でコンパイル
が通りません。どこが間違っているのでしょうか?

vector<int> line2vec2(string line, char delim, unary_function<string,int> func)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),func());
tansform(v.begin(),v.end(),v2.begin(),func);
=>両方ともコンパイルは通らなかったです。
return v2;
}

よろしくお願いします。
0032デフォルトの名無しさん2008/01/16(水) 21:18:07
コンパイルエラー書け。
v, v2の型は何だ。
0033デフォルトの名無しさん2008/01/16(水) 21:21:28
>>23
一時オブジェクトが作られてるね。一時オブジェクトそのものは仕様にあると思う。
コンパイラの警告レベルを上げると一時オブジェクトを作った警告が出せるコンパイラもあったと思う。
0034デフォルトの名無しさん2008/01/16(水) 21:29:21
>>28>>30
ありがとうございます
すっきりしました

>>33
bccでもconstを外すと「一時変数を云々」という旨の警告が出ます。
0035デフォルトの名無しさん2008/01/16(水) 21:30:11
>>23
VC++ 2008でも同じ結果。
キャストの結果は右辺値(一時オブジェクト)
これは仕様。ただし、同じ型へのキャストはno effect
だったと思うような思わないような。
メイヤーズかなんかの本でチラっと書いて
あった気がする。
0036デフォルトの名無しさん2008/01/16(水) 21:30:25
>>28>>30
ありがとうございます
すっきりしました
0037デフォルトの名無しさん2008/01/16(水) 21:33:00
>>34
それは標準準拠してないから。
bccは非constリファレンスでも左辺値以外の値を
参照できてしまう。
0038デフォルトの名無しさん2008/01/16(水) 22:41:31
>>32
すいません。
コンパイルエラー
test.cpp:73: instantiated from here
/usr/include/c++/4.2.1/bits/stl_algo.h:936: error: no match for call to
'(std::unary_function<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, int>) (std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&)'

vの型vector<string>
v2の型vector<int>
です。

先の関数はこんな感じ() {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<int> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func);
return v2;
}
0039デフォルトの名無しさん2008/01/16(水) 22:42:34
std::map<wstring, HPEN> pens;
std::for_each(pens.begin(), pens.end(), ここ);
と書くと、「ここ」の関数に
std::pair<wstring, HPEN>
が渡されると思うのですが、
BOOL DeleteObject(HGDIOBJ)なので
都合よくHPENだけ渡す方法はないでしょうか?
0040デフォルトの名無しさん2008/01/16(水) 22:56:11
Microsoft OutLook 2003のメールのルール仕分けにあるような
テキストボックスにリンクを複数貼ってクリックするとフォームが開き
その開くフォームがフォルダダイアログだったりアドレス入力フォームだったりと
一行ずつ異なるリンク付きテキストボックスはどのようにつくればいいのでしょうか?

RichTextBoxで作ろうにもリンクしている文字列が開いたフォームで変えられるので
LinkClickedのリンク文字列で判断は難しく、同名のリンクが複数あった場合などで困っております。

どなたか良い方法を教えてください。
0041デフォルトの名無しさん2008/01/16(水) 22:59:43
>>39
ファンクタ
0042デフォルトの名無しさん2008/01/16(水) 23:03:48
>>31>>38
unary_function型そのものには関数呼び出しが定義されてないからエラー
そもそもunary_function型はそのように使うことを想定されていない


template <typename T> vector<int> line2vec2(string line, char delim, const T& func)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),func());
tansform(v.begin(),v.end(),v2.begin(),func);
=>両方ともコンパイルは通らなかったです。
return v2;
}
0043デフォルトの名無しさん2008/01/16(水) 23:06:14
間違えたw
コメント残しっぱだし……

template <typename T> vector<int> line2vec2(string line, char delim)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),T());
return v2;
}
0044デフォルトの名無しさん2008/01/16(水) 23:47:03
そこでU+2028の改行ですよ。
0045デフォルトの名無しさん2008/01/17(木) 01:03:03
"数値を文字列として入力して、一桁ずつを配列にいれて計算する"

場合ですが、引き算・掛け算の計算方法を誰か言葉で説明してください!

例えば足し算なら
「下の桁から一桁ずつ足していって10を超えたら次の配列に桁上げしていれる」
となるんですが。。
おねがいします!
0046デフォルトの名無しさん2008/01/17(木) 01:08:08
>>45
aとbの掛け算なら、aをb回足し算すればいいと思うよ
0047デフォルトの名無しさん2008/01/17(木) 01:19:59
筆算の要領で計算すりゃいいんじゃないの
0048デフォルトの名無しさん2008/01/17(木) 01:30:24
>>46
50桁の掛け算なんですがそれで大丈夫ですかね?(+_+)
やってみます!
あざす!

>>47
筆算みたいに計算するって書いたら先生にそんな単純に書くなって言われました↓
でもあざす!
0049デフォルトの名無しさん2008/01/17(木) 09:35:35
C/C++ では標準的にインデントとしていくつのスペースを
入れるのがよいのでしょうか?2 となっているコードもあるし
4となっているコードもあります.
0050デフォルトの名無しさん2008/01/17(木) 09:36:21
4でも6でも8でも構いません。
3や5でもいいですよ。
0051デフォルトの名無しさん2008/01/17(木) 11:44:49
標準なんてないだろう。俺は4だけど。
0052デフォルトの名無しさん2008/01/17(木) 11:49:01
>>42-43
ありがとうございます。
そうすると、unary_function()を引数にもらって、それを内部で使う関数というのは
かけないのですか?
void *のポインタをもらって、内部で適当にキャストして、unary_function()として
使えたりしないのかな。
とりあえずやってみます。
0053デフォルトの名無しさん2008/01/17(木) 12:13:01
a=1/350,1/320,1/360,1/368,1/397,1/400
b=1/7.90,1/8.12,1/8.23,1/8.56,1/7.97,1/8.68
と仮定する。
for ($i=0; $i<=5; $i++) {
$p1 = (1/$a[$i])**$a * (1-1/$a[$i])**($play-$a);
$p2 = (1/$b[$i])**$b * (1-1/$b[$i])**($play-$b);
$p3 = $p1 * $p2;

$t_ap += $p1; push(@ap,$p1);
$t_bp += $p2; push(@bp,$p2);
$t_abp += $p3; push(@abp, $p3);
}

上記の構文で計算すると分母に差があるのでオーバーフローを起こす・・・と言われました。
**($play-$a);←この部分の計算に問題があるようなのですが、プログラムに疎いので良く判りません><
問題のある部分をどのように記述するべきなのかご指導お願い致します。m(_ _)m

0054デフォルトの名無しさん2008/01/17(木) 12:18:48
ここは、C/C++のスレなんだが
0055デフォルトの名無しさん2008/01/17(木) 12:20:36
>>54
すいませんm(_ _)m
どこで聞けば良いのでしょう?
0056デフォルトの名無しさん2008/01/17(木) 12:21:39
自分の使ってる言語のスレを探せばいいだろうが
http://pc11.2ch.net/tech/subback.html
0057デフォルトの名無しさん2008/01/17(木) 12:22:31
>>52
unary_functionへの参照をもらえばいいんじゃないかね
0058デフォルトの名無しさん2008/01/17(木) 12:24:01
>>56
それすら判りません><
0059デフォルトの名無しさん2008/01/17(木) 12:26:19
>>58
Perlについての質問箱 34箱目
http://pc11.2ch.net/test/read.cgi/tech/1199977642/
0060デフォルトの名無しさん2008/01/17(木) 12:26:46
コマンド名か、コンパイル時の画面に書いてないか。
0061デフォルトの名無しさん2008/01/17(木) 12:29:49
unary_functionの関数呼び出し演算子って
仮想関数になってんの?
0062デフォルトの名無しさん2008/01/17(木) 12:53:20
unary_functionはテンプレート引数をargument_typeとresult_typeにtypedefしてるだけにすぎん
0063デフォルトの名無しさん2008/01/17(木) 12:54:49
だよねやっぱ
じゃあunary_function型で引数を取ること自体が意味無い、だよね
0064デフォルトの名無しさん2008/01/17(木) 13:02:36
以下のソースプログラムをコンパイルして実行したのですが

M:\>sort3.exe
入力ファイル名: 
と表示されて、そこからどうすればいいかわかりません。

ファイル入出力とソートの宿題なのですが、
いかんせん超がつくほどの初心者なので…。

どなたかよろしかったらお願いします。
使っているソフトはVisual C++ 2005 Express Edition です。



0065デフォルトの名無しさん2008/01/17(木) 13:03:04
上のソースプログラムです。
/* sort3.c */
#include <stdio.h>
struct kamoku { char mei[20];
char kana[10];
int ei;
int koku;
int su;
int sha;
int ri;
}
#define SIZE 30
main(){
struct kamoku seiseki[SIZE], min;
int i,j,m,n;
FILE *input, *output;
char infname[16], outfname[16];

printf("入力ファイル名: ");
scanf("%s",infname);
printf("出力ファイル名: ");
scanf("%s",outfname);

if((input=fopen(infname,"r")) == NULL ){
printf("ファイルがありません\n");
exit(1);
}
if((output=fopen(infname,"r")) == NULL ){
printf("ファイルが作成できません\n");
exit(1);
}
0066デフォルトの名無しさん2008/01/17(木) 13:06:19
>>64
入力ファイル名を入力する。

・・・ってかプログラム以前にパソコン教室に通うべきだな。
0067デフォルトの名無しさん2008/01/17(木) 13:12:05
>>66
どのようなファイルを入力すべきかがわかりません。
初心者ですみません。
0068デフォルトの名無しさん2008/01/17(木) 13:15:42
>>67
鼬害。キーボードの使い方やファイルとは何かと言ったことは
プログラミング以前の知識です。
0069デフォルトの名無しさん2008/01/17(木) 13:18:13
>>67
ちゃんと授業にはでようね
0070デフォルトの名無しさん2008/01/17(木) 13:24:44
>>57
やってみましたが、ダメなようです。

vector<int> line2vec2(string line, char delim, const unary_function<string,int> &func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<int> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func());
return v2;
}

>>61
仮想関数になっているかどうかはよくわかりませんでしたが、
stlのソースを見ていると、pointer_to_unary_functionというクラスが
ありました。今度はこれで試してみる。
0071デフォルトの名無しさん2008/01/17(木) 13:40:25
なんか無駄に複雑な事になってるな
0072デフォルトの名無しさん2008/01/17(木) 13:41:27
>>70のつづき
もうなんだかわけがわからなくなってきた。
unary_functionはArgとResのtypedefなんですか?
STLのコンパイルエラーメッセージはやくにたたん。
0073デフォルトの名無しさん2008/01/17(木) 13:53:51
普通std::unary_functionは継承して使わないと役に立たないと思うんだが。
0074デフォルトの名無しさん2008/01/17(木) 14:14:06
>>72
そもそもunary_functionを引数にしようとした理由は?
普通継承したファンクタ作るよね
0075デフォルトの名無しさん2008/01/17(木) 14:17:44
std::unary_functionやstd::binary_functionを継承する理由は
std::bind2ndなどのアダプタがargument_typeとresult_typeを
必要とするから。

それ以上の意味はない。別にstd::unary_functionを継承しなくても
自分でargument_typeとresult_typeをtypedefしてもいい。
0076デフォルトの名無しさん2008/01/17(木) 14:33:29
こんな感じか?
template <typename T>
vector<int> line2vec2(string line, char delim, T func) {
transform(v.begin(), v.end(), v2.begin(), func());
}

line2vec2( , , std::ptr_fun(関数ポインタ));
line2vec2( , , 関数オブジェクト());
0077デフォルトの名無しさん2008/01/17(木) 14:35:18
間違えた
>transform(v.begin(), v.end(), v2.begin(), func());
transform(v.begin(), v.end(), v2.begin(), func);こうだな
0078デフォルトの名無しさん2008/01/17(木) 15:04:35
>>76-77
>>42-43
0079デフォルトの名無しさん2008/01/17(木) 15:06:07
>>72
今回のエラーメッセージは割と理解できるものだし、
そもそも何が駄目なのか指摘されてるのに
まるで見当違いの方法を試しているのはお前自身だ
0080762008/01/17(木) 15:10:05
>>78
>>43はstd::ptr_funが使えない。
0081デフォルトの名無しさん2008/01/17(木) 15:45:44
>>80
おう、こりゃ失礼
0082コンパイルできた2008/01/17(木) 15:48:16
皆さんのおかげ様で、とうとうできました。
ソースは以下です。

template <class T, typename T2>
vector<T> line2vec2(string line, char delim, T2 func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<T> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func);
return v2;
}
この関数をこんな感じで使う。
string s = "1 2 3 4 5 - 6 7 8 9";
vector<int> v = line2vec2<int>(s, ' ', string2int());
0083コンパイルできた2008/01/17(木) 15:48:54
<82の続きです>
ちなみにstring2int()は以下のように定義しました。
class string2int : public unary_function<string,int> {
public:
unary_function<string,int>::result_type operator() (unary_function<string,int>::argument_type str) {
if (str == "-")return 0;
else return static_cast<int>(atoi(str.c_str()));
}
};

いやー、すげえ感謝感謝。今回答えてくれた方々には昼飯一回おごってもいいくらいス。
0084デフォルトの名無しさん2008/01/17(木) 15:57:07
昼飯一回程度の感謝
0085デフォルトの名無しさん2008/01/17(木) 16:04:00
>>83
もうちょっと本買って読んだ方がいいな
0086デフォルトの名無しさん2008/01/17(木) 16:04:23
名無しの書き込みから個人を特定して昼飯をおごる程の感謝
えらく大変だな
0087762008/01/17(木) 17:44:29
>>83
昼飯はいいから俺がニート脱出できるように神様にお願いしといてください。
0088デフォルトの名無しさん2008/01/17(木) 20:00:30
#include <iostream>
#include <cstdio>

char ch[10];

int main()
{
while ((cin.getlie(char, 10)) != EOF) {

}
}


これをコンパイルしようとするとwhileの行でエラーが出るのですが、
何がいけないのでしょうか??
0089882008/01/17(木) 20:02:08
すいませんwhileの行のcharはchの間違いです。
0090デフォルトの名無しさん2008/01/17(木) 20:03:38
>>88
余分なものが付いているk 「ar」 a
0091デフォルトの名無しさん2008/01/17(木) 20:04:32
getlie
0092デフォルトの名無しさん2008/01/17(木) 20:04:36
getlie ではなくて getline な。
分かってるとは思うけど
0093デフォルトの名無しさん2008/01/17(木) 20:04:38
>>88
std:: n が足りない
0094882008/01/17(木) 20:12:05
回答くださった方ありがとうございます。
すいません色々抜けていました。。orz
正しくはこれです。

#include <iostream>
#include <cstdio>
using namespace std;

char ch[10];

int main()
{
while ((cin.getline(ch, 8)) != EOF) {

cout << "test";
}
}


これでもコンパイルできないのです。
whileの行でエラー出ます。

0095デフォルトの名無しさん2008/01/17(木) 20:14:35
>>94
!= EOFこれが不要。
質問するときはエラーの内容も書いてくれ。
0096デフォルトの名無しさん2008/01/17(木) 20:14:54
>>94

#include <iostream>

char ch[10];

int main()
{
 while (std::cin.getline(ch, 8)) {
  std::cout << "test";
 }
}
0097デフォルトの名無しさん2008/01/17(木) 20:35:00
#include <iostream>

int main()
{
  char ch[10];
  while (std::cin.getline(ch, sizeof ch)) {
    std::cout << "test";
  }
}
0098デフォルトの名無しさん2008/01/17(木) 21:21:43
Fedora6 gcc
でファイルの更新を検知するプログラムを作りたいのですが、
更新までブロックする関数を教えてください。

if (ファイルの更新までブロック)
{
//更新された
read();
...
}
みたいなカンジです。

ちなみにtailのソースを見てみたのですが、
1秒毎にファイルが更新されたかチェックして処理をしているようです。

何秒毎にチェックするのではなく、更新までブロックできる関数がわかればいいです。

よろしくお願いします。
0099デフォルトの名無しさん2008/01/17(木) 21:29:34
なんでそんなものが存在するという前提で物事を進めようとするの?
0100デフォルトの名無しさん2008/01/17(木) 21:38:03
てゆーかチェックせずに、更新されると発見してほしいのかよwwwwwwwww
0101デフォルトの名無しさん2008/01/17(木) 21:42:18
Windows だとディレクトリの更新を検知してシグナル送ってくれる
FindFirstChangeNotification/FindNextChangeNotification って API があるから
他の OS でもそういう API があるんじゃないかと思う気持ちも分からんでも無い。
■ このスレッドは過去ログ倉庫に格納されています