2009-07-26 8 views
1

프로그램 외부에서 생성 된 파일을 읽으려고하는데 문제가 있습니다. 이 프로그램은 사용자가 파일을 만들도록합니다. 그런 다음 프로그램 외부에서 생성 된 두 개의 .txt 파일에서 단어를 읽고 생성 된 파일에 단어를 씁니다.외부에서 생성 된 파일에서 데이터 읽기

#include "std_lib_facilities.h" 

int main() 
{ 
    string word; 

    cout << "Create file.\n"; 
    char name[20]; 
    cin >> name; 
    ofstream ost(name, ios::out); 

    cout << "Open first file.\n"; 
    char filename[20]; 
    cin >> filename;  
    ifstream ist(filename); 
    while(ist >> word) ost << word << " "; 
    ist.close(); 

    cout << "Open second file.\n"; 
    cin >> filename; 
    ifstream isttwo(filename); 
    while(isttwo >> word) ost << word << " "; 
    isttwo.close(); 

    ost.close(); 

    keep_window_open(); 
} 

그러나 만든 파일을 메모장에서 열면 비어있게됩니다. 읽히는 파일이 따로 생성 되었기 때문에 문자열을 읽는 것이 불가능하기 때문입니까? 나는 정말로 모른다. 어떤 도움을 주셔서 감사합니다.

+1

루프가 실행되고 있는지 확인 했습니까? 어떤 이유로 오픈 ist 및 isttwo가 실패했기 때문에 ost가 비어있을 수 있습니다. – Sean

+0

그래, 그게 문제 야. txt 파일의 단어가 단어로 읽히지 않는다고 생각합니다. 내가 단어를 읽는 법을 알아야한다. 내가 그것을 테스트했을 때 나는 while 루프에서 cout << word를 추가했으나 아무 것도 나오지 않았다. – trikker

+0

방금이 코드를 시도했지만 완벽하게 작동했습니다. 입력 파일이 올바른 디렉토리에 있는지 확실합니까? (출력 파일이 생성 된 디렉터리와 같은 디렉터리에 있어야합니다.) – Sean

답변

1

코드가 정확합니다. 첫 번째 파일의 이름을 쓰고 두 번째 파일의 확장명을 쓸 것인지 확인하십시오. 예를 들어 :

first.txt 
second.txt 
+0

파일 형식을 포함 시켰을 때 제대로 작동했습니다. – trikker

0

잠재적 인 문제는 getline 대신 cin을 사용하는 것입니다.

이 입력을 상상해

Open second file. 
>>file one.txt 

CIN 당신이 공간을 명중 한 번 읽기를 정지 때문에 분명히 원하는 파일을 열 수 없습니다.

ost.open(name); 

나는 또한 동안 루프에서 >> 연산자의 당신의 암시 적 사용을 좋아하지 않는다 :

명시 적으로 같은 이름을 열어보십시오. 이것을 시도하십시오 :

while (!ist.eof()) 
{ 
    getline(ist, word); 
    ost << word; 
} 
+0

이것은 실습 연습 코드이며 오류 처리를 구현할 의도가 없습니다. – trikker

+0

cin 객체는 공백이있는 까다로운 작업도 수행하므로 문제가 아닌 것으로 생각하더라도 getline을 사용하고자 할 수 있습니다. – jkeys

+0

당신이 실제로 내 질문에 대답 할 수 있다면 그것은 위대 할 것이다. 그렇지 않다면 당신의 대답은 단순한 운동을 위해 불필요한 코드 최적화 일 뿐이다. – trikker

0

어쩌면 파일 이름 [20] 문자열을 종결해야합니다. filename [20] = {0}; 표준 입력으로부터 가져 오기 전에; 그런 다음 콘솔에서 파일 이름을 인쇄하여 파일 이름이 올바른지 확인하십시오.

+0

아니요, char *는 배열의 마지막 바이트에 쓰려고하지 않는 한 항상 null로 종료됩니다. – jkeys

0

Trikker,

코드 사소한 변화로 컴파일하고 실제로 작동하지만 나는 당신이 겪고있는 동일한 문제를 건너 왔어요. 여기 나와 함께 일어난 일이 있습니다. 그것은 당신이 프로그램을 어떻게 운영하고 있는지와 관련이 있습니다. exe 파일은 ../ProjectDir/Debug 디렉토리에 저장됩니다. 두 개의 입력 파일을 Debug 디렉터리에 저장하는 경우 IDE가 아닌 명령 프롬프트에서 프로그램을 실행해야합니다 (Visual Studio 2008 가정). 그러나 IDE에서 실행하면 ../ProjectDir/ProjectDir에 두 개의 입력 파일을 저장하십시오. 내가 한 번 모든 것이 나에게 괜찮 았어.

그냥이 디렉토리 일에 대해 확신하기 위해 IDE에서 프로그램이 실행되는 디렉토리를 인쇄했습니다. 그러나 프롬프트에서 Debug 디렉터리에서 exe를 실행하고있는 것으로 나타나면 작업 디렉터리는 실제로 ProjectDir/ProjectDir입니다.

어쨌든 다음 코드를 제공하고 알려주십시오.

// #은 아마 전혀 아무것도를 읽는 경우 인쇄하려고 할 때, 아무것도하지 않은 이유를 설명 "std_lib_facilities.h을"

#include <fstream> 
#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    system("cd"); 
    //string word; 
    char word[80]; 
    cout << "Create file.\n"; 
    char name[20]; 
    cin >> name; 
    ofstream ost(name, ios::out); 

    cout << "Open first file.\n"; 
    char filename[20]; 
    cin >> filename;  
    ifstream ist(filename); 
    while(ist >> word) ost << word << " "; 
    ist.close(); 

    cout << "Open second file.\n"; 
    cin >> filename; 
    cout << filename; 
    ifstream isttwo(filename); 
    while(isttwo >> word) ost << word << " "; 
    isttwo.close(); 

    ost.close(); 

    //keep_window_open(); 
} 

이 디렉토리 문제 등이 있습니다. 입력 파일 작성에 성공했는지 확인해야합니다. 그렇게하려면 그냥 추가하십시오 ...당신이 절대 경로를 사용하면 어떻게됩니까

ifstream ist(filename) 
0

if (ist.fail()){ 
    cout << "file open failed\n"; 
} 

? 예 : Windows에서 c:\file.txt 등을 시도해보십시오.

관련 문제