4

テキストファイルを読み込もうとしていますが、何も表示されません。Visual Studioの[リソース]フォルダーで正しくリンクされていないように感じますが、ダブルクリックするとVisual Studioで正常に開き、開くかどうかをテストしても問題はありません。プログラムは現在正常にコンパイルされますが、出力はありません。コマンドプロンプトに何も出力されません。助言がありますか?

コード

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

int main()
{
    char str[100];
    ifstream test;
    test.open("test.txt");

    while(test.getline(str, 100, '#'))
    {
        cout << str << endl;
    }

    test.close();
    return 0;
}

テキストファイル

This is a test Textfile#Read more lines here#and here
4

2 に答える 2

10

パスを指定せずに名前でファイルを開こうとします。これは、ファイルがプログラムの現在の作業ディレクトリにあることを意味します。

問題は、VSIDEからプログラムを実行するときの現在のディレクトリにあります。VSはデフォルトで、実行中のプログラムの現在の作業ディレクトリをプロジェクトディレクトリに設定します$(ProjectDir)。ただし、テストファイルはリソースディレクトリにあります。そのopen()ため、関数はそれを見つけることができず、getline()すぐに失敗します。

解決策は簡単です-テストファイルをプロジェクトディレクトリにコピーします。または、それをターゲットディレクトリ(.exe通常はプログラムファイルが作成される場所)にコピーし、VS IDEの作業ディレクトリ設定を変更します:、$(TargetDir)に設定します。この場合、IDEとコマンドライン/Windowsエクスプローラーの両方から機能します。$(ProjectDir)\Debug$(ProjectDir)\ReleaseProject->Properties->Debugging->Working Directory

別の可能な解決策-呼び出しでファイルへの正しいパスを設定しますopen()。テスト/教育の目的でハードコーディングすることもできますが、実際にはこれはソフトウェア開発の良いスタイルではありません。

于 2012-10-22T19:24:40.300 に答える
1

これが役立つかどうかはわかりませんが、出力用のテキストファイルを開いてから読み直したかったのです。VisualStudio(2012)では、これが難しいようです。私の解決策を以下に示します。

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

string getFilePath(const string& fileName) {
	string path = __FILE__; //gets source code path, include file name
	path = path.substr(0, 1 + path.find_last_of('\\')); //removes file name
	path += fileName; //adds input file to path
	path = "\\" + path;
	return path;
}

void writeFile(const string& path) {
	ofstream os{ path };
	if (!os) cout << "file create error" << endl;
	for (int i = 0; i < 15; ++i) {
		os << i << endl;
	}
	os.close();
}

void readFile(const string& path) {
	ifstream is{ path };
	if (!is) cout << "file open error" << endl;
	int val = -1;
	while (is >> val) {
		cout << val << endl;
	}
	is.close();
}

int main(int argc, char* argv[]) {
	string path = getFilePath("file.txt");
	cout << "Writing file..." << endl;
	writeFile(path);
	cout << "Reading file..." << endl;
	readFile(path);
	return 0;
}

于 2015-05-06T19:29:49.570 に答える