2016-04-22 10 views
1

ファイルを開きたいです。簡単に。 fopen()を使用してください。ただし、どのファイルを開くかはユーザーの入力によって異なります。私はKornシェルスクリプトに多少堪能ですが、これは変数置換を使って簡単にできます:$(var)。私はCで正しい形式を理解することができません。誰かが私にいくつかの洞察力を与えてくれますか? 私のコード -Cでの可変置換

#include <stdlib.h> 
#include <stdio.h> 

char statsA[100]; 
char fileA[50]; 

int main (void) 
{ 

printf("Enter file to open\n"); 
gets(fileA); 


FILE *statsA; 
statsA = fopen("c:/Users/SeanA/C/***<fileA>***", "r+"); 

.......................................^ What goes here? 

私はfopenを文字列にユーザー入力を含める方法がわからないと思います。

+1

'sprintf'関数を調べてみてください。 – FCo

+0

それ以外の場合は 'strcat'です。 –

+2

さらに、 '' snprintf'(http://linux.die.net/man/3/snprintf)です。 – Oka

答えて

0

scanfを実行して、ユーザーからファイルを取得します。

ファイル名を保持するchar配列を作成します。

char filename[15];

今のファイル名を尋ねる:

printf("What is the name of the file?\n");

scanf("%s", &filename);

注:完全なファイル名を含めます。私は、ユーザーがfilename.txt

を入力する必要がありますfilenameと呼ばれるテキストドキュメントを持っている場合ので、今、あなたはファイル名を持っているあなたは今、あなたがあるべきファイルポインタ

FILE * fp;

fp = fopen(filename, "r");

を宣言することができますあなたのファイルをスキャンすることができます!

fscanf(fp, "%d", &value);

EDIT:私はあなたがあなたのファイルパスで文字列の連結を望んでいた気付きませんでした。

あなたが事前に定義されたパスを知っているので、あなたは今、あなたは一緒にすべてを持ってstrcatを使用することができ、その文字列のパス

char fullPath[100];

char path[75] = "c:/Users/SeanA/C/";

を保持している別のchar配列を作ることができます!

strcat(fullPath, path);

strcat(fullPath, filename);

今、あなたは、あなたが手動で両方の文字列を連結しなければならないfopen(fullPath, "r");

+0

ファイル名にスペースが含まれていれば 'scanf'は失敗し、getsと同じバッファオーバーフローの問題があることに注意してください。 – hyde

+1

とにかく、Cで文字列連結を行う方法についての質問です。あなたの答えはそれに答えるようではありません。 – hyde

+0

確かに彼の目的のために、彼はあまり心配していないかもしれません。私はscanfファイル名では、if文に1を入れるかどうかを調べることができます。そうでない場合は、エラーが発生します。 – Enigma

0

を行います。このようなもの

char* folder = "c:/Users/SeanA/C/"; 
char* path = malloc(strlen(fileA) + strlen(folder) + 1); 
path = strcpy(folder); 
path = strcat(fileA); 

FILE *statsA = fopen(path, "r+"); 

free(path);//Always free your memory 
0

これはsprintfの対象です。 printfのように動作しますが、出力はstdoutではなく文字列になります。

char filename[100]; 
sprintf(filename, "c:/Users/SeanA/C/%s", fileA); 
statsA = fopen(filename, "r+"); 

また、statsAの定義は、あなたがmainマスクファイルスコープで定義の内部で持っています。これらの異なる名前を付けたいと思うかもしれません。