2012-07-10 2 views
0

Я просто изучаю самые основные аспекты потоков ввода-вывода и, похоже, не вижу, чтобы моя программа читала текстовый файл. Это дает мне ошибки, которые указывают, что он пытается прочитать .txt-файл как код на C++, в то время как я просто использую значения, чтобы проверить мой поток.Программа на C++ видит включенный .txt файл как код

Это содержимое моего включены .txt файл:

12345 
Success 

А вот код главной программы:

#include <fstream> 
#include <iostream> 
#include "C:\Users\Pavel\Desktop\strings.txt" 
using namespace std; 

int main (int nNumberOfArgs, char* pszArgs[]) 
{ 
    ifstream in; 
    in.open("C:\Users\Pavel\Desktop\strings.txt"); 
    int x; 
    string sz; 
    in << x << sz; 
    in.close(); 
    return 0; 
} 

Первое сообщение об ошибке я получаю это «ожидается безоговорочную идентификатор до того числовая константа ", которая говорит мне, что программа пытается скомпилировать включенный файл. Как я могу предотвратить это и прочитать текстовый файл по назначению?

+3

Вы включаете файл, поэтому да, компилятор пытается проанализировать файл как код. – TheZ

+1

Как только вы удалили это '# include', вы также должны изменить' in << x << sz; 'to' in >> x >> sz; '. –

+2

Также исправьте путь 'in.open (« C: \\ Users \\ Pavel \\ Desktop \\ strings.txt »)' – sehe

ответ

8

Не #include ваш .txt-файл. Включены для исходного кода. Они текстово вставляют файл в ваш код, как если бы вы его скопировали в него. Вы не должны быть #include с файлом, который вы открываете с помощью ifstream.

1

Директива #include работает одинаково независимо от расширения прилагаемого файла - txt, h, никакого расширения вообще - это не имеет значения. Как это работает, содержимое файла вставляется в исходный файл препроцессором до того, как этот файл будет передан компилятору. Что касается компилятора, вы можете просто скопировать и вставить содержимое самостоятельно.

+0

* «Что касается компилятора, вы можете просто скопировать и вставляли содержимое сами ». * - Технически верно, но дьявол находится в деталях. Например, '__FILE__' будет сообщать имя файла' # include'd, но если вы вставляете содержимое, оно будет оценивать имя ранее включенного источника # include. : -/(Прекрасное различие между «в отношении компилятора» и «в отношении препроцессора», просто стоит упомянуть.) – HostileFork

2

Открытие файлов в файловой системе во время выполнения не требует упоминания имени этого файла в исходном коде. (Вы могли бы, например, попросить пользователя указать имя файла, а затем открыть его просто отлично!)

В случае, если вы могли бы #include данные в вашем источнике были бы, если бы вы хотели, чтобы эти данные были встроены в исполняемый файл вашей программы (и, следовательно, не полагаться на файл, который был в файловой системе при запуске). Но для этого вам необходимо отформатировать файл как допустимое объявление данных C++. Так что в этот момент это не будет файл .txt.

Например, в strings.cpp

#include <string> 

// See http://stackoverflow.com/questions/1135841/c-multiline-string-literal 
std::string myData = 
    "12345\n" 
    "Success"; 

Затем в основной программе:

#include <iostream> 
#include <sstream> 
#include "strings.cpp" 
using namespace std; 

int main (int nNumberOfArgs, char* pszArgs[]) 
{ 
    istringstream in (myData); 
    int x; 

    // Note: "sz" is shorthand for "string terminated by zero" 
    // C++ std::strings are *not* null terminated, and can actually 
    // legally have embedded nulls. Unfortunately, C++ does 
    // have to deal with both kinds of strings (such as with the 
    // zero-terminated array of char*s passed as pszArgs...) 
    string str; 

    // Note: >> is the "extractor" 
    in >> x >> str; 

    // Note: << is the "inserter" 
    cout << x << "\n" << str << "\n"; 

    return 0; 
} 

Вообще говоря, просто #include -ную исходный файл, как это не так, как вы хотите заниматься вещами. У вас быстро возникнут проблемы, если вы сделаете это в нескольких файлах вашего проекта (дублируйте объявления myData). Таким образом, обычный трюк состоит в том, чтобы разделить вещи на файлы заголовков и файлы реализации ... включая заголовки столько раз, сколько вы хотите, но только поместив одну копию реализации в свой процесс сборки.

 Смежные вопросы

  • Нет связанных вопросов^_^