2012-07-10 1 views
0

저는 입/출력 스트림의 아주 기본적인 측면을 배우고 있으며, 프로그램에서 텍스트 파일을 읽지 못하는 것 같습니다. C++ 코드로 .txt 파일을 읽으려는 오류를 표시합니다. 스트림을 테스트하기 위해 값을 사용하고 있습니다. 메인 프로그램의 코드 여기C++ 프로그램은 포함 된 .txt 파일을 코드로 봅니다.

12345 
Success 

과 :

내 포함 .txt 파일의 내용입니다

내가받은 첫 번째 오류 메시지가 "전에 비정규-ID를 것으로 예상된다
#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;'를'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' 파일의 이름을보고합니다. 그러나 내용을 붙여 넣으면 이전에'#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이 같은 소스 파일을 -ing, 말하기, 당신이 원하는 방법이 아니다 어떤것을하다. 프로젝트의 둘 이상의 파일에서 myData의 선언을 중복하면 문제가 발생합니다. 그래서 보통의 트릭은 헤더 파일과 구현 파일을 여러 번 분리하는 것입니다. 원하는만큼 여러 번 헤더를 포함하지만 구현 과정을 빌드 프로세스에만 넣는 것입니다.

관련 문제