我正在编写一个小型控制台程序,我想将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的菜鸟,所以详细的解释将不胜感激。
答案 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文件?
如上所述(以及为什么我删除了不相关的cmake标记),这与创建可执行程序的构建过程无关。
您的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,特别是如果你正在阅读字符串,因为它不安全。