C ++ Почему моя программа-пример не создает выходной файл? - PullRequest
2 голосов
/ 13 сентября 2010

Я пишу небольшую / бета-программу тестирования, которая будет использоваться в моей гораздо большей программе для проекта.Он запрашивает у пользователя имя входного файла (IE data.txt) и создает выходной файл с именем filename.out (IE data.out).Я пробовал простой outFile << "текст здесь";попробовать, но это не создает выходной файл.Я уверен, что я тут что-то напутал, но не могу понять что.</p>

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

//Global variables 
ifstream inFile;
ofstream outFile;


void main()
{
// Requests user for input filename
string inputFile;           
cout << "Enter File Name: ";
cin >> inputFile;
string outputFile = inputFile.substr(0, inputFile.find_last_of('.')) + ".out";
// Opens both inputFile and outputFile
inFile.open(inputFile.c_str(), ios::in);
outFile.open(outputFile.c_str(), ios::in);
// Checks for input file
if (!inFile)
 {
      cout << "Unable to open file" << endl;
      exit(1);
 }

outFile << "Hello world!";

inFile.close();
outFile.close();
}

Ответы [ 2 ]

9 голосов
/ 13 сентября 2010

Поскольку вы пытаетесь открыть файл для чтения:

outFile.open(outputFile.c_str(), ios::in);

Используйте ios::out вместо.

3 голосов
/ 13 сентября 2010
  1. Почему вы сделали эти потоки глобальными переменными, а не локальными?В C ++ обычно предпочитают создавать объекты как можно позже.Если вы сделаете это, у вас будет вся доступная информация для открытия потоков прямо в конструкторе, который может принимать те же аргументы, что и open() функция-член.

  2. Одна разница между std::ifstream и std::ofstream в том, что их open() функции-члены и конструкторы применяют другой режим открытия по умолчанию.Это in для std::ifstream и out для std::ofstream.Вы всегда можете переопределить их, но это несколько устранило бы причину использования этих потоков в первую очередь.Вы также можете использовать std::fstream.Для этого вы всегда должны предоставить режимы открытия.Если вы используете std::ifstream и std::ofstream, просто пропустите режимы открытия.Вот как это выглядит при использовании конструкторов вместо open() функций-членов (с последними это выглядит примерно так же):

    std::ifstream inFile(inputFile.c_str());
    std::ofstream outFile(outputFile.c_str());
    
  3. Это int main(), дажеесли некоторые компиляторы позволяют void.

  4. У меня есть серьезные возражения против использования директив .Но эти возражения не так широко распространены, как другие мнения, перечисленные в этом ответе.

...