如何在C ++中使用cmake和freopen?

时间:2016-07-14 21:48:11

标签: c++

我正在编写一个小型控制台程序,我想将stdin / stdout指向与cpp文件位于同一目录下的txt文件的读/写。 cpp看起来像这样:

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

和CMakeLists.txt文件如下所示:

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文件。 我应该在CMakeLists.txt中添加什么来在构建中包含txt文件? PS:我是CMake的菜鸟,所以详细的解释将不胜感激。

3 个答案:

答案 0 :(得分: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");调试它。

答案 1 :(得分:0)

  

检查后我注意到freopen无法找到txt文件。我应该在CMakeLists.txt中添加什么来在构建中包含txt文件?

如上所述(以及为什么我删除了不相关的标记),这与创建可执行程序的构建过程无关。

您的CMakeLists.txt文件中没有任何内容可供添加。

如果要在运行程序时访问这些文件,请确保程序在与这些文本文件存在的同一工作目录中运行,或使用完全限定的文件路径打开它们。

答案 2 :(得分: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);
}

在我使用包含in.txt的一行的5运行此文件后,文件out.txt包含Read: 5,如预期的那样。我使用Linux和gcc,并在命令行上完成所有操作,所有内容都在同一目录中。如果您希望它们位于当前目录以外的任何目录中,则需要添加路径

即使你使它工作,最好添加大量的错误检查,包括检查freopen的返回值以确保它成功,以及scanf的返回值以确保它成功。或者更好的是,避免使用scanf,特别是如果你正在阅读字符串,因为它不安全。