2016-07-14 15 views
0

私は小さなコンソールプログラムを書いていると私はcppのファイルと同じディレクトリにあるTXTファイルからの読み込み/書き込みに標準入力/標準出力を指示します。C++でcmakeをfreopenと一緒に使うには?

int main(){ 
    freopen("in.txt","r",stdin); 
    freopen("out.txt","w",stdout); 
    //read input 
    scanf(...); 
    //proccess input 
    //proccsing.... 
    //output 
    printf(...); 
} 

と、このようなCMakeLists.txtファイルを見て:このような CPPを見て何か

cmake_minimum_required(VERSION 3.5) 
project(ACM) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
set(SOURCE_FILES main.cpp) 
add_executable(ACM ${SOURCE_FILES}) 

は、プロジェクトが正常にビルドが、それは任意の出力を生成しません。チェックの後、私はfreopenがtxtファイルを見つけられないことに気付きました。 は私がビルドでのtxtファイルをインクルードするCMakeLists.txtに何を追加する必要がありますか? PS:私はCMakeのノブであるので、詳細な説明をいただければ幸いです。

+3

_は「確認した後、私はfreopenははTXTファイルを見つけるために失敗していることに気づいた」_どのようにビルドプロセスに関連していることでしょうか?無関係のタグをすべて削除しました。あなたがアクセスしたいファイルは、あなたのプログラムが開始されたディレクトリと同じディレクトリにある必要があります。 –

答えて

1

あなたが本当にCMakeLists.txtに次の定義を追加し、デバッグ目的のためにそれを必要とする場合:

add_definitions(-DSRC_PATH="${CMAKE_SOURCE_DIR}") 

と、このようなファイルを再度開く:

freopen(SRC_PATH"/in.txt","r",stdin); 
freopen(SRC_PATH"/out.txt","w",stdout); 

これは、Linux上で動作し、他のUNIX上で動作するはずですWindowsの下でスラッシュを使用していくつかの操作を追加する必要があります。とにかく、あなたはprintf("%s\n", SRC_PATH"/in.txt");によってそれをデバッグするかもしれません。

+0

働いてくれてありがとう – Shadowfirex

0

チェックの後、私はfreopenがtxtファイルを見つけられないことに気付きました。ビルドにtxtファイルを含めるには、CMakeLists.txtに何を追加する必要がありますか?

前述したように(そして無関係なタグを削除した理由)、これは実行可能プログラムを作成するビルドプロセスとは関係ありません。

あなたCMakeLists.txtファイルに追加するものは何もありません。

あなたがプログラムを実行するときに、これらのファイルへのアクセス権を持っている、いずれかのプログラムがこれらのテキストファイルが存在する場合と、同じ作業ディレクトリで実行されることを保証する、またはそれらを開くために完全修飾ファイル・パスを使用したい場合。

0

あなたが開いているファイル名にパスを指定していないので、彼らはあなたのプログラムが実行された時点で、現在のディレクトリになければなりません。

#include <stdio.h> 
int main() 
{ 
    freopen("in.txt","r",stdin); 
    freopen("out.txt","w",stdout); 

    //read input 
    int i; 
    scanf("%d", &i); 

    //output 
    printf("Read: %d\n", i); 
} 

を私は期待通り5からなる1行、Read: 5を含まout.txtをファイルを含むin.txtでこれを実行した後:それは実際に建設するように、私は少しだけあなたのプログラムを肉付け。私はLinuxとgccを使い、コマンドラインですべてを行いました。すべて同じディレクトリにあります。現在のディレクトリ以外のディレクトリに入れたい場合は、パスを追加する必要があります

戻り値がであるかどうかをチェックするなど、十分なエラーチェックを追加すると良いでしょう。成功したかどうか、scanfの戻り値が成功したかどうかを調べます。あるいは、特に安全でないので、文字列を読み込んでいる場合は、scanfを避けてください。

関連する問題