ジメジメする梅雨のお悩み、一挙解決! >>

今、バイナリデータから値を取りだそうとがんばっています。
しかし、うまくいかずに困っています。
困っていることは2点あります。

(1)バイナリデータにはリトルエンディアンで格納していると書いています。
まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか?

(2)バイナリデータには、
はじめに文字列(char)型4バイトで「RIFF]という値
次に32ビット符号なし整数で4バイトの数字、
次に4052バイトの構造体
などと収納されているようです。
このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか?

全然できなくて困っています。
教えていただけないでしょうか?
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

> Cで書きかたいのですが。

ご存知でしょうか?

#include <stdio.h>

int main() {
/* かき */
{
char data[] = "RIFF\x78\x56\x34\x12";
FILE* fp;
fp = fopen("test.bin", "wb");
fwrite(data,16,1,fp);
fclose(fp);
}
/* よみ */
{
char data[5];
int n;
FILE* fp;
fp = fopen("test.bin","rb");
fread(data,4,1,fp);
data[4] = '\0';
fread(&n,4,1,fp);
printf("[%s] %x\n", data, n);
fclose(fp);
}
return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/05/04 20:55

バイト単位で読み込んで適当に変換すればいいのでは?



まさか「リトルエンディアンが分からない」とかいうことはありえないよね.
    • good
    • 0
この回答へのお礼

少し頑張ってみます。

お礼日時:2011/05/04 20:55

> (1)バイナリデータにはリトルエンディアンで格納していると書いています。


> まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか?

Intel 86系CPU(8086, 80n86, Pentium xxx, Celeron xxx, Core xxx,etc)はリトルエンディアンです。

リトルエンディアンなCPUを使う場合には普通に読めば良いです。

※モトローラ68系のCPUはリトルエンディアンでないので上位バイトと下位バイトを入れ替える必要があります。CPUにはビッグエンディアンなCPUとリトルエンディアンなCPU, どちらにも設定できるCPUなどがあります。


> (2)バイナリデータには、
> はじめに文字列(char)型4バイトで「RIFF]という値
> 次に32ビット符号なし整数で4バイトの数字、
> 次に4052バイトの構造体
> などと収納されているようです。
> このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか?

tarコマンドのソースを参考にしては。


#include <stdio.h>

typedef struct {
char riffmark[4];
unsigned int uintval;
char structdata[4052];
} riffdata;

int main( void )
{
FILE *fp;
int result;
union {
char buff[4096];
riffdata rdata;
} readdata;

fp = fopen( "sample.riff", "r" );
result = fread( readdata.buff, 4+sizeof(unsigned int)+4052,1 , fp );
fclose(fp);

return 0;
}

こんな感じで、 readdata.rdata.riffmark[]に'R' 'I' 'F' 'F'が、readdata.rdata.uintvalにRIFFの次のunsigned int値が、readdata.rdata.structdata[4052]にその後の4052バイトが読めると思いますよ。
char structdata[4052]の部分適切に構造体でも定義してやればその構造体の形で読めるかと。
    • good
    • 0
この回答へのお礼

ありがとうございます。
今、参考にさせていただきながら、書いています。

返信遅れてすみませんでした。

お礼日時:2011/05/04 20:57

> リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか



お使いのCPU(言語)はリトルエンディアンですか、ビッグエンディアンですか。

リトルエンディアンであれば書かれている形式に合った変数で読むだけです。例えば、

> 32ビット符号なし整数で4バイトの数字

なら、unsigned int (32bit)の変数で読みます。intで読むと負の数になってしまう場合があります。

構造体もその構造にあった変数で読みます。

(ただし、バイナリデータをバイナリエディタで確認しておいた方が良いと思います。4バイトの文字列がほんとに4バイトだけなのか、先頭に1バイトの文字数が入っていないかとか、1文字が4バイト(後ろは3バイトのゼロ)で書き込まれていないかとか。)

ビッグエンディアンの場合は、バイトの順を逆にする必要があります。

文字は(書き方によりますが)順を逆にしなくも大丈夫だと思いますが、整数や実数はバイト列を逆にする必要があります。

リトルエンディアンとビッグエンディアンの変換は、「リトルエンディアン ビッグエンディアン」で検索すれば例題が多く見つかりますから、検索してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/05/04 20:56

(1) リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか?



エンディアンが異なる場合、適宜反転すること。

(2)

例: 4byteの文字列、続いて4byte-intを読む(C++)

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main() {
// かき
{
char data[] = "RIFF\x78\x56\x34\x12";
ofstream stream("test.bin", ios::binary);
stream.write(data,16);
}
// よみ
{
char data[4];
ifstream stream("test.bin");
stream.read(data,4);
string head(data,data+4);
cout << head << endl;
int n;
stream.read(reinterpret_cast<char*>(&n),4);
cout << hex << n << endl;
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます。すみません、できれば、Cで書きかたいのですが。ご存知でしょうか?

お礼日時:2011/04/24 12:46

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC++でバイナリデータの扱い方

以下のプログラムで接続先からバイナリデータを取得しているのですが
coutで出力しても画面に何も表示されません。

------------------------------------------------------
/*include部分は省きます*/
std::string bin; //1

clx::http session(clx::uri::encode(ip), 80); //2
session.get(clx::uri::encode(param)); //3

bin = session.body(); //4
std::cout << bin << std::endl; //5

------------------------------------------------------
上記プログラムを空ファイルにリダイレクトしバイナリエディタで見たら
ちゃんとデータは書き込まれていました。

5行目を以下のように変えても空欄が出力されただけで文字は表示されませんでした
std::cout << std::hex << bin << std::endl;

しかし以下のようにすると文字数は表示されました。
std::cout << bin.length() << std::endl;

やりたいこととしてはphpのpack()、unpack()的な部分です。
例えば

値をフォーマットを指定してバイナリデータとして出力
$val=pack("L", 35);

とか

バイナリデータを変数から指定バイト分取り出して10進数で画面に出力
$bin=(バイナリデータ);
$val=unpack("c",$bin);
echo(sprintf("%d",$val));

です。
バイナリの扱いはリトルエンディアンです。

ご教示お願いしますm(__)m

以下のプログラムで接続先からバイナリデータを取得しているのですが
coutで出力しても画面に何も表示されません。

------------------------------------------------------
/*include部分は省きます*/
std::string bin; //1

clx::http session(clx::uri::encode(ip), 80); //2
session.get(clx::uri::encode(param)); //3

bin = session.body(); //4
std::cout << bin << std::endl; //5

------------------------------------------------------
上記プログラムを空ファイルにリダイレクトしバイナ...続きを読む

Aベストアンサー

#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>

using namespace std;

int main() {
const char raw[] = { 0x6a, 0x54, 0x5, 0x7a };
string bin(raw,4);

cout.fill('0');
for_each( bin.begin(), bin.end(),
[](char ch) { cout << hex << setw(2) << ((int)ch & 0xff) << ' '; });
cout << endl;
}
/* 実行結果
6a 54 05 7a
*/

Q16進数を10進数に簡単に変換する関数は?

16進数を10進数に簡単に変換する関数は何かありますか?
もしご存知でしたら教えていただけないでしょうか?

例えば、3BDF8という16進数を10進数に変換したいと思っています。

Aベストアンサー

C言語のプログラム内では、保持している数値にn進数という概念はなく
文字列化するときに初めて考えるものです。

int n; // <- このnは何進数でもない

ご質問を以下のように解釈してサンプルを書いてみました。

例えば、3BDF8という16進数(の文字列)を10進数(の文字列)に変換したいと思っています。


$ cat test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
int num;
sscanf(argv[1], "%x", &num);
printf("%d\n", num);
}

$ ./a.out 3BDF8
245240

いかがでしょうか。

Qシフト演算を用いた変換

シフト演算を用いて、データを変換したいのです。

例えば、「00 01 0B 0A」となっているデータを、「0A 0B 01 00」となるようにシフト演算を用いて、変換したいのです。
0Aで1byteとなっていて、1byteごとにデータを格納して入れ替えるなど、方法は考えてみたのですが、実際のプログラムがさっぱり思いつきません。

ヒントだけでもいいので、教えていただけると嬉しいです。
すみませんが、よろしくお願いします。

Aベストアンサー

リトルエンディアンからビッグエンディアンまたはビッグエンディアンからリトルエンディアンへの変換ですね。

シフト演算子を使って計算するのであれば、ビット演算子を使えば実現できますね。

例えば、C言語風に書けば

i = 0x00010b0a ;
i = i<<24 | i<<8 & 0x00ff0000 | i>>8 & 0x0000ff00 | i>>24 & 0x000000ff ;

で出来ていると思います。
演算子の優先順位があるので、言語が違えば答えが変わってしまう可能性もありますので、

i = (i<<24) | ((i<<8) & 0x00ff0000) | ((i>>8) & 0x0000ff00) | ((i>>24) & 0x000000ff) ;

の様に括弧でくくる必要があるかもしれません。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QC ファイル出力で、フォルダがない場合でも作成する方法

先日、皆さんに教えていただき

Cで出力ファイルを指定のフォルダに出す方法が上手く出来ました。
具体的には、↓こうやって指定しました。
sprintf( buff, "%s\\%s", path, filename );

やっていて思ったのですが、
この方法だと、指定フォルダが最初から無いとエラーが出てしまいます。
フォルダが無かったら、作成し、その中にファイルを出力していってくれる。という方法はできるものなのでしょうか?

もしできるようなら教えて下さい!!
よろしくお願いします!

Aベストアンサー

★回答ではないが余談。
・koko_u_ さんありがとう。
 気づくとアンダーバーの関数名で置き換わっているみたいですね。
 他にも気づくといろいろ置き換わっていますね。
 C 関数、最近使っていないのでアンダーバーの関数名で調べてみます。
・ありがとうございました。

●質問者さんへ。
・_mkdir() 関数が使える場合はその関数でもフォルダ(ディレクトリ)が作成できます。
 それでは。

参考URL:http://www5c.biglobe.ne.jp/~ecb/c/12_14.html

QC言語 バイナリファイルをfloatにしたいのですが…

16進数で表示すると以下のようなバイナリファイルがあります。

42 b9 e0 a4 3b df ea c0 3a 70 eb dc 37 7c f4 8c

これを4バイトずつfloatに入れて出したいのですが、

本当はこのように出したいのですが、
[0][92.93875]
[1][0.0068334043]
[2][9.190419E-4]
[3][1.50773085E-5]

このような値がでてしまいます
[0][-9.745835E-17]
[1][-7.339750E+00]
[2][-5.301601E+17]
[3][-3.766891E-31]

ソースはこれです。
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *fp;
long size, n;
float *buf;
int i = 0;

if (argc != 2) return 1;

/* FILE OPEN */
fp = fopen(argv[1], "rb");
if (fp == NULL) return 1;

/* FILE SIZE */
fseek(fp, 0, SEEK_END);
size = ftell(fp);
rewind(fp);
printf("FILE SIZE %ld\n", size);

/* FILE READ */
buf = malloc(size);
if (buf == NULL) return 1;
n = fread(buf, 1, size, fp);

/* FILE PRINT */
for(i=0;i<10;i++)
{
printf("[%d][%E]\n", i, buf[i]);
}

return 0;
}

本日一日調べましたが良くわかりませんでした。
開発環境は以下の内容です。

$ uname -a
Linux fedoracore6 2.6.20-1.2962.fc6 #1 SMP Tue Jun 19 19:27:14 EDT 2007 i686 athlon i386 GNU/Linux

$ gcc --version
gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-13)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

何かお知恵を拝借出来ないものでしょうか??
よろしくお願い致しますm(_ _)m

16進数で表示すると以下のようなバイナリファイルがあります。

42 b9 e0 a4 3b df ea c0 3a 70 eb dc 37 7c f4 8c

これを4バイトずつfloatに入れて出したいのですが、

本当はこのように出したいのですが、
[0][92.93875]
[1][0.0068334043]
[2][9.190419E-4]
[3][1.50773085E-5]

このような値がでてしまいます
[0][-9.745835E-17]
[1][-7.339750E+00]
[2][-5.301601E+17]
[3][-3.766891E-31]

ソースはこれです。
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ...続きを読む

Aベストアンサー

実験的に、こんなコードを書いてみました。
当方の環境はリトルエンディアンのため、
ビッグエンディアンで格納してあるデータの
バイトオーダーを変換しています。

【実行結果】
a4 e0 b9 42 9.293875e+01
c0 ea df 3b 6.833404e-03
dc eb 70 3a 9.190419e-04
8c f4 7c 37 1.507731e-05


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

int main(void)
{
  unsigned char s[] = { // ファイルから読んだ内容
    0x42, 0xb9, 0xe0, 0xa4, 0x3b, 0xdf, 0xea, 0xc0,
    0x3a, 0x70, 0xeb, 0xdc, 0x37, 0x7c, 0xf4, 0x8c,
  };
  unsigned char t[4];
  float f;
  int i, j;
  
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      t[j] = s[4*i-j+3]; // バイトオーダーの変換
      printf("%x ", t[j]);
    }
    memcpy(&f, t, 4);
    printf(" %e\n", f);
  }
  return 0;
}

(注)インデントのため、全角空白を使っています。

実験的に、こんなコードを書いてみました。
当方の環境はリトルエンディアンのため、
ビッグエンディアンで格納してあるデータの
バイトオーダーを変換しています。

【実行結果】
a4 e0 b9 42 9.293875e+01
c0 ea df 3b 6.833404e-03
dc eb 70 3a 9.190419e-04
8c f4 7c 37 1.507731e-05


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

int main(void)
{
  unsigned char s[] = { // ファイルから読んだ内容
    0x42, 0xb9, 0xe0, 0xa4, 0x3b, 0xdf, 0xea, 0xc0,
    0x3a, 0...続きを読む

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報