2016-07-14 10 views
0

Ich schreibe ein kleines Konsolenprogramm und ich möchte stdin/stdout zu einem Lesen/Schreiben von TXT-Dateien im selben Verzeichnis mit der CPP-Datei verweisen. die CPP in etwa so aussehen:Wie verwendet man CMake mit Freopen in C++?

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

und die CMakeLists.txt Datei sieht wie folgt aus:

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}) 

Das Projekt baut erfolgreich, aber es erzeugt keine Ausgabe. Nach der Überprüfung bemerkte ich, dass Freopen die TXT-Dateien nicht finden kann. Was sollte ich zu CMakeLists.txt hinzufügen, um txt-Dateien in den Build aufzunehmen? PS: Ich bin ein Noob in CMake, so dass eine detaillierte Erklärung geschätzt werden würde.

+3

_ "Nach der Überprüfung habe ich festgestellt, dass Freopen die TXT-Dateien nicht findet" _ Wie ist das mit dem Build-Prozess verbunden? Ich habe alle irrelevanten Tags entfernt. Die Dateien, auf die Sie zugreifen möchten, müssen sich im selben Verzeichnis befinden, aus dem Ihr Programm gestartet wurde, so einfach. –

Antwort

1

Wenn Sie es für Debug-Zwecke wirklich, fügen Sie die folgende Definition zu CMakeLists.txt:

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

und öffnen Sie Dateien wie folgt aus:

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

unter Linux funktioniert, auf anderen Unix arbeiten sollten ähnlich wie Plattformen und erfordern unter Umständen einige zusätzliche Manipulation mit Schrägstrichen unter Windows. Wie auch immer, Sie können es debuggen durch printf("%s\n", SRC_PATH"/in.txt");.

+0

Es hat funktioniert, vielen Dank – Shadowfirex

0

Nach der Überprüfung habe ich festgestellt, dass Freopen die TXT-Dateien nicht finden kann. Was sollte ich zu CMakeLists.txt hinzufügen, um txt-Dateien in den Build aufzunehmen?

Wie bereits erwähnt (und warum entfernte ich den irrelevant -Tag), die nichts mit dem Build-Prozess zu tun hat, dass Ihr ausführbares Programm erstellt.

Es ist nichts hinzuzufügen in Ihrer CMakeLists.txt Datei.

Wenn Sie beim Ausführen Ihres Programms Zugriff auf diese Dateien haben möchten, stellen Sie entweder sicher, dass Ihr Programm im selben Arbeitsverzeichnis wie diese Textdateien ausgeführt wird oder verwenden Sie vollständig qualifizierte Dateipfade, um sie zu öffnen.

0

Da Sie in den Dateinamen, die Sie öffnen, keinen Pfad angeben, müssen sie sich zum Zeitpunkt der Programmausführung im aktuellen Verzeichnis befinden. Ich konkretisierte Ihr Programm nur ein bisschen so, dass es tatsächlich bauen würde:

#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); 
} 

Nachdem ich dies lief mit in.txt eine Zeile mit dem 5 aus, um die Datei out.txt Read: 5 enthalten ist, wie erwartet. Ich habe Linux und gcc benutzt und alles in der Kommandozeile gemacht, alles im selben Verzeichnis. Wenn Sie möchten, dass sie sich in einem anderen Verzeichnis als dem aktuellen Verzeichnis befinden, müssen Sie Pfade hinzufügen

Auch nachdem Sie es funktioniert haben, wäre es gut, viele Fehlerprüfung hinzufügen, einschließlich Überprüfung der Rückgabewert von freopen um sicherzugehen, dass es gelingt, und um den Rückgabewert von scanf sicherzustellen, dass es erfolgreich ist. Oder besser noch, vermeiden Sie scanf, besonders wenn Sie Strings lesen, da es unsicher ist.

Verwandte Themen