0

入力/出力ストリームの非常に基本的な側面を学習しているだけで、プログラムにテキスト ファイルを読み取らせることができないようです。.txt ファイルを C++ コードとして読み取ろうとしていることを示すエラーが表示されますが、ストリームをテストするためにそこにある値を使用しているだけです。

これらは、含まれている .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;
}

最初に表示されるエラー メッセージは、"expected unqualified-id before numeric constant" で、プログラムがインクルード ファイルをコンパイルしようとしていることを示しています。これを防ぎ、テキスト ファイルを意図したとおりに読み取るにはどうすればよいですか?

4

3 に答える 3

8

#include.txt ファイルを使用しないでください。インクルードはソースコード用です。実際にコピーして貼り付けたかのように、コードにファイルをテキストで挿入します。#include.で開いているファイルを ing するべきではありませんifstream

于 2012-07-10T08:05:11.713 に答える
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このようなソース ファイルを単純に -ing することは、やりたいことではありません。プロジェクト内の複数のファイルでこれを行うと、すぐに問題が発生します (myData の重複宣言)。したがって、通常のトリックは、物事をヘッダー ファイルと実装ファイルに分けることです...ヘッダーを必要な回数だけ含めますが、実装のコピーを 1 つだけビルド プロセスに入れます。

于 2012-07-10T08:23:34.760 に答える
1

ディレクティブは、含まれるファイルの拡張子 (txt、h、拡張子なし)#includeに関係なく同じように機能します。それは問題ではありません。ファイルがコンパイラに渡される前に、ファイルの内容がプリプロセッサによってソース ファイルに貼り付けられます。コンパイラに関する限り、コンテンツを自分でコピーして貼り付けただけかもしれません。

于 2012-07-10T08:09:41.793 に答える