C言語なら俺に聞け(入門篇) Part 21at TECH
C言語なら俺に聞け(入門篇) Part 21 - 暇つぶし2ch784:デフォルトの名無しさん
07/11/26 22:01:41
r+ は途中にも書き込める。
a+ はファイルの終わりにしか書き込めない。

785:デフォルトの名無しさん
07/11/26 22:14:53
>>784
挿入可能って事ですか?
それとも上書きが出来るって事でしょうか。

色々試してみてるけど思うように扱えないです。

786:デフォルトの名無しさん
07/11/26 22:23:12
r+ は上書き可能。こんな感じ。       ポップアップ用アンカー >>786
#include <stdio.h>
#include <stdlib.h>

int main() {
static const char FILENAME[] = "test.txt";
FILE *fp;
int x = 0;

/* とりあえず 10 と書き込む */
fp = fopen(FILENAME, "w");
fprintf(fp, "%d", 10);
fclose(fp);

fp = fopen(FILENAME, "r+"); /* r+ で開く */

/* ファイルの先頭から数値を読み出す */
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 10 と出力されるはず */

/* ファイルの先頭に移動して 30 と書き込む */
fseek(fp, 0, SEEK_SET);
fprintf(fp, "%d", 30);

/* またファイルの先頭に移動して数値を読み出す */
fseek(fp, 0, SEEK_SET);
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 30 と出力されるはず */

fclose(fp);
return EXIT_SUCCESS;
}

787:デフォルトの名無しさん
07/11/26 22:32:56
分かり易い解説ありがとうございます。
上記の例で、"a+"だと、
10
1030
と出力されちゃうんですね。

fseek関数はまだ触った事ないので勉強してみようと思います。

788:デフォルトの名無しさん
07/11/26 23:07:17
/* fseekってイマイチよく分からん。 オフセットとかなんだか知らんが
読んだときか書き込んだときでかは忘れたけど、数字で
int型の4バイトの時と、char型の1バイトの時があってイミフ。
チラシの裏で馬鹿なレスだからスルーしてね^^ */

789:デフォルトの名無しさん
07/11/26 23:43:55
>>788
それは恐らくfseek()が判らないのではなくて、fprintf()で書き込むのかfwrite()で書き込むのかの
違いがよく判っていないんジャマイカ。

>>787
書き込み後は、fseek()(或いはそのサブセットのrewind())をするか、明示的にfflush()しないと
書き込んだ結果が実際のストリームに出力される保障がないことに注意。

まぁ、ファイル先頭に移動するにはrewind()の方が判りやすいだろうね。

790:デフォルトの名無しさん
07/11/26 23:56:48
条件によって01を記録し、
記録した情報を順番に読み取って01を判別し、
条件分けをしたいのですが思ったとおりになりません。。
具体的には、書き込み
FILE *fp;
char output = 0;
int bit = 0;
fp = fopen("bitstream","rb");
for(i=0; i...... )
{
if(bit == 8)
{bit = 0; fputc(output,fp);}
if(条件)
{手順1; output = ((output<<1) | 0x01); bit++;}
else
{手順2; output <<= 1; bit++;}
}
output = (output<<(7-bit));
fputc(output,fp);
読み込み
char a;
for(i=0; ){
if(bit == 8)
{a = getc(fp); bit = 0;}
if( ( a >> (7-bit) ) & 0x01 )
{手順1; }
else
{手順2; }
bit++;}
こんな感じで書いてるんですが、どこかおかしいところがあればご指摘ください。

791:デフォルトの名無しさん
07/11/27 00:13:53
float *a;
a = new float();
*a = 120;
float *temp = a;

これはOKですよね

float *temp = 120

これはなんでダメなんですか?


792:デフォルトの名無しさん
07/11/27 00:29:03
tempが格納するのはアドレスだから。
120を変数に格納して、その変数のアドレスをtempに渡すなどする必要がある。

793:デフォルトの名無しさん
07/11/27 00:30:17
newはC++なんだけど

794:デフォルトの名無しさん
07/11/27 00:30:49
セミコロンが無いから。

795:デフォルトの名無しさん
07/11/27 00:32:19
つまり
float *tempは、ポインタとして宣言してる状態で、そこにaのアドレスが入って、
temp = a となっている、ということですか?上の例だと

で、3行目の
*a =120 は aのアドレスをもったところに120をぶち込んでる、ということで
float *tempとは別ものなんですよね?



796:デフォルトの名無しさん
07/11/27 00:47:27
564.1
451.6
154.1
[EOF]

こういう風になってるテキストファイルがあるときに
「EOFまで数字をテキストファイルから読み込む」という作業をする場合はどうすればいいんでしょうか?

i=0;
while(1){
if(fread(&c,sizeof(char),1,fp)==EOF) break;
else
{
data[i]=fscanf(fp,"%lf\n",&value);
i++;
}
}

こんな感じにかいたらdata[0][1][2]には564.1 451.6 154.1 が入っているんでしょうか?
よくfreadとfscanfなどがわかっていないのでよろしくお願いします。


797:デフォルトの名無しさん
07/11/27 00:47:38
別もの。
*a=120の*はデリファレンス、float *tempの*はポインタ宣言。

798:ワカメ高専
07/11/27 01:05:59
[-3,3] fx=1/(1+5x^2) 分点の数 10個(n=9)
これをラグランジュで求めて結果を出力するプログラムを作れって(c or c++)言われたけどさっぱりでしゅ

799:デフォルトの名無しさん
07/11/27 01:44:24
>>798
課題丸投げは宿題スレへ
スレリンク(tech板)

800:デフォルトの名無しさん
07/11/27 01:49:31
>>796
i=0;
while(1){
if (fscanf(fp, "%lf", &data[i]) == EOF) {
break;
}
i++;
}

801:デフォルトの名無しさん
07/11/27 01:55:32
>>795
そう。上の例は
float *a;
a = new float();
*a = 120;
float *temp;
temp = a;
に等しい。下の例は
float *temp;
temp = 120;
ということになる。floatポインタに整数120は代入できない(型が異なる)のでエラー。

802:デフォルトの名無しさん
07/11/27 02:14:26
エラーにはならないだろボケ


803:デフォルトの名無しさん
07/11/27 02:16:13
>>791
別に駄目じゃねーよ。
期待してるのとは違う動作だろうけどな。

804:801
07/11/27 02:19:44
本当だ、エラーにはならんね、すまそ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch