책에 있는 소스에는 strstream.h 을 include 하라고 하는데 visual c++ include 디렉토리에 보니까 strstream 밖에 없는데 이럴땐 어떻게 해야하죠? 그냥 #include <strstream> 이렇게 쓰면 되는건가요? 그렇게 했더니 계속 에러 나던데. 제가 vc++ 첨써봐서 모르거든요.
strstream.h 화일 자체가, 보통 Visual Studio 6.0 이 깔린 상태에서는 로칼에 존재하지 않습니다.
다시말해, C:\Program Files\Microsoft Visual Studio\VC98\include 폴더에 존재하지 않지요. http://groups.google.co.kr/groups?q=re+strstream.h&hl=ko&lr=&ie=UTF-8&oe=UTF-8&newwindow=1&selm=ew6af1CBDHA.2376%40TK2MSFTNGP10.phx.gbl&rnum=2
위 글을 읽어보시면 이유를 아실수있겠군요.
"The <strstream.h> header is an old implementation for stringstreams.
These are deprecated by the C++ standard.
Instead, the safer <sstream> header should be used."
고로, Visual Studio 6.0 에서 돌려보고 싶다면,
include <strstream.h> 을 #include <sstream> 로 수정하고,
ostrstream 을 std::ostrstream 로 수정하는 등,
다소의 수정이 필요합니다.
근데 헤더 파일을 수정했는데도 역시 에러가 나네요. 어디 어디를 수정해야 하는지 좀 얘기 해 주시겠어요?
// readvar.cpp
// write a stream of persons, using fstream.h
#include <fstream.h>
#include <sstream>
#include <string.h>
#include "writeper.cpp"
istream & operator >> (istream & stream, Person & p)
{ // read fields from stream
char delim;
stream.getline(p.LastName, 30,'|');
if (strlen(p.LastName)==0) return stream;
stream.getline(p.FirstName,30,'|');
stream.getline(p.Address,30,'|');
stream.getline(p.City, 30,'|');
stream.getline(p.State,15,'|');
stream.getline(p.ZipCode,10,'|');
return stream;
}
int ReadVariablePerson (istream & stream, Person & p)
{ // read a variable sized record from stream and store it in p
// if read fails, set p.LastName to empty string and return 0
short length;
stream . read ((char *)&length, sizeof(length));
if (stream . fail()){p.LastName[0]=0; return 0;}
char * buffer = new char[length+1];
stream . read (buffer, length);
buffer [length] = 0; // terminate buffer with null
istrstream strbuff (buffer);
strbuff >> p;
return 1;
}
int main (){
char filename [20];
Person p;
cout << "Enter the file name:"<<flush;
cin.getline(filename, 19);
ifstream stream (filename, ios::in);
if (stream.fail()) {
cout << "File open failed!" <<endl;
return 0;
}
while (1) {
// read fields of person
ReadVariablePerson (stream, p);
if (strlen(p.LastName)==0) break;
// write person to file
cout << p;
}
}
// person.cpp
#include <iostream.h>
#include <string.h>
#include "person.h"
istream & operator >> (istream & stream, Person & p)
{ // read fields from input
cout<<"Enter last name, or <cr> to end: "<<flush;
stream.getline (p.LastName, 30);
if (strlen(p.LastName)==0) return stream;
cout<<"Enter first name: "<<flush; stream.getline(p.FirstName,30);
cout<<"Enter address: "<<flush; stream.getline(p.Address,30);
cout<<"Enter city: "<<flush; stream.getline(p.City, 30);
cout<<"Enter state: "<<flush; stream.getline(p.State,15);
cout<<"Enter zip code: "<<flush; stream.getline(p.ZipCode,10);
return stream;
}
// person.h
#ifndef PERSON
#define PERSON
class Person
{ public:
// data members
char LastName [11]; char FirstName [11]; char Address [16];
char City [16]; char State [3]; char ZipCode [10];
// method
Person (); // default constructor
};
Person::Person ()
{//constructor
LastName[0]=0; FirstName[0]=0; Address[0]=0;
City[0]=0; State[0]=0; ZipCode[0]=0;
}
#endif
dev C++에서는 다음과 같은 에러가 나는걸요
Quote:
d:\person.o(.text+0x0):person.cpp: multiple definition of `Person::Person(void)'
d:\writeper.o(.text+0x0):writeper.cpp: first defined here
d:\readvar.o(.text+0x0):readvar.cpp: multiple definition of `Person::Person(void)'
d:\writeper.o(.text+0x0):writeper.cpp: first defined here
d:\readvar.o(.text+0x74):readvar.cpp: multiple definition of `operator<<(ostream &, Person &)'
d:\writeper.o(.text+0x74):writeper.cpp: first defined here
d:\readvar.o(.text+0x1f8):readvar.cpp: multiple definition of `operator>>(istream &, Person &)'
d:\person.o(.text+0xb4):person.cpp: first defined here
제가 비주얼 C++을 첨 써보는데 어디다 질문 해야 할지 몰라서 여기다 질문 하게 되었습니다. 얼굴이 달아오르긴 했지만..(그것도 모르냐는 말에. 좀 챙피하네요) 뭐 그래도 앞으론 KLDP의 L자가 뭔지는 잊어버리지 않을거 같습니다.
그리고. 제가 보는 책이 오래된 책이 맞나봅니다. file structure - michael J. folk, bill zoellick, greg riccardi 인데 책에 나온 소스를 dev c++에서도 돌려봤는데 안 되길래, visual C++ 깔고 돌려본거 였거든요. 제 질문은 헤더파일을 어떻게 고쳐야 하는가.였는데, vc++6 얘기가 나올줄은 몰랐습니다.
함수 원형이나 선언은 .h 에만 두시고 #include 는 .h 파일만 하십시오.
함수 정의는 cpp 로 빼시구요.
Person::Person() 의 구현도 Person.cpp 으로 뽑아야 합니다.
이해가 잘 안가시면 다른 좋은 C++ 서적에서 '선언' 과 '정의' 의 차이를 찾아보시기 바랍니다.
님의 코드에서는 여기저기에 Person::Person() 과 operator >> 가 중복정의되었습니다.
에러메세지도 친절히 알려주고 있군요. "multiple definition" 라고.
[기억에는 int 인가?를 리턴해야 했는데 , return을 빼먹었죠 근데도 ,그냥 0을 리턴했던걸로 기억합니다]
지금은 바뀌었는지 모르겟지만요
윈도우 용을 설치하니까 약간 이상한 점이 처음에 있더군요. 컴파일러 위치,
include 디렉토리 위치, 링크 디렉토리 위치 등을 잘 지정해 주면 제대로
잘 돌더군요. 개인적으로는 Mingw에서 쓰고 있는데 gcc 버전이 같다면,
그 자체는 동일하게 작동하는 것 같습니다. 다른 거는 리눅스와 윈도우의
차이인 것 같구요. 현재는 gcc 3.3.3 까지 포팅이 되어 있네요...
혹, 리눅스의 gcc에서는 잘 적용되던 표준이 dev-C++에서 잘 안 되셨다면,
(아마도 mingw난 cygwin일 텐데... cygwin은 정말 겅의 동일하니까 아마도
mingw일 듯...) 환경 설정에서 디레토리나 실행 파일들 위치나 gcc 버전은
동일한 지 확인해 보시면 될 듯... 개인적으로는 사소한 걸로 무진장 애
먹었습니다. 처음에 리눅스에서는 한 방세 잘 되던 소스가 컴파일리 안 되서
황당했습니다. 정말 표준에 나오는 것들만 사용한 소스였는데... 쩝~~
저는 VC++ 은 안 써 봐서 모르겠네요. 윈도우에서는 프로그래밍을 해 본 적이
없어서, 리눅스에서 쓰던 컴파일러는 그대로 쓸 수 있어서 쓰고 있는데,
아주 만족해 하고 있습니다.
에러 메시지를 올려 주세요.
에러 메시지를 올려 주세요.
-----
http://monpetit.posterous.com/
http://monpetit.tistory.com/
using namespace std;아마도... include밑에 이
using namespace std;
아마도... include밑에 이걸 적어주시면...
아. 찾았습니다.
아. 찾았습니다
근데 헤더 파일을 수정했는데도 역시 에러가 나네요. 어디 어디를 수정해야 하는지 좀 얘기 해 주시겠어요?
dev C++에서는 다음과 같은 에러가 나는걸요
음...
KLDP에서 'L'자가 뭔지 아십니까?
질문은 질문할 곳을 찾아가며 해야합니다.
어디가서 해야할지 모르겠다면 www.devpia.com 으로 가보세요.
기본적인 프로그래밍 질문이나 개념적 질문이라면 이해가 가겠지만,
질문이 VC++환경에 대한 질문아닙니까?
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
[quote]#include <iostream.h>#inc
등은 전부
으로 바꾸세요. 이것이 표준입니다.
그리고 표준라이브러리에 들어있는 것(string, cout 등)은 전부 std namespace에 들어있습니다. 따라서 std::string , std::cout 과 같은 식으로
바꾸던지, 아니면 include 아래에
를 추가하면 됩니다.
마지막으로 VC++6.0을 쓰고 계신다면 컴파일러를 다른 것으로 바꾸시기 바랍니다.
제 생각에는 그리좋은 컴파일러가 아닌 것 같습니다.
MFC같은게 필요한게 아니라면 DEV-C++을 추천합니다.
[quote="exsider"]마지막으로 VC++6.0을 쓰고 계신다면
객관적으로 봐도 VC++6.0은 나쁜 컴파일러입니다. :-) Visual Studio.net 2003이나 Dev-C++을 쓰세요.
그리고 iostream.h가 나온다면 그 책도 나쁩니다. 그 책의 최신판을 찾아보시던지 다른 책을 보십시요.
- 죠커's blog / HanIRC:#CN
vc++6.0이 dev-c++보다 좋은 점이라면 컴파일 속도죠 :)
vc++6.0이 dev-c++보다 좋은 점이라면 컴파일 속도죠 :)
오래된 책을 보시는것 같은데... 잠시 덮어두고 다른책을 보시는게 어떨까 싶습니다.
답변감사합니다~
제가 비주얼 C++을 첨 써보는데 어디다 질문 해야 할지 몰라서 여기다 질문 하게 되었습니다. 얼굴이 달아오르긴 했지만..(그것도 모르냐는 말에. 좀 챙피하네요) 뭐 그래도 앞으론 KLDP의 L자가 뭔지는 잊어버리지 않을거 같습니다.
그리고. 제가 보는 책이 오래된 책이 맞나봅니다. file structure - michael J. folk, bill zoellick, greg riccardi 인데 책에 나온 소스를 dev c++에서도 돌려봤는데 안 되길래, visual C++ 깔고 돌려본거 였거든요. 제 질문은 헤더파일을 어떻게 고쳐야 하는가.였는데, vc++6 얘기가 나올줄은 몰랐습니다.
그래도 하루종일 왜 안되지 하고 있었는데 답변 달아 줘서 감사합니다~
그런데 여전히 안되네요.
최근에 MS에서 C++ 컴파일러를 공개한 것은 아시리라 믿습니다.
최근에 MS에서 C++ 컴파일러를 공개한 것은 아시리라 믿습니다.
http://msdn.microsoft.com/visualc/vctoolkit2003/
잠깐 돌려봤는데 표준 C++ 예제 정도 돌리는 정도라면 컴파일 속도도 빠르고 쓸만하더군요. 그러나 이상하게도 WinAPI는 지원을 안하더군요. SDK를 깔아야 된다나 뭐라나...
참고삼아 말씀드리면 제가 컴파일할때 쓰는 옵션은 예제 파일에 나와있는 그대로인 cl /EHsc filename.c 입니다.
우선 strstream 과 아무 관계가 없는 에러입니다. [cod
우선 strstream 과 아무 관계가 없는 에러입니다.
#include "writeper.cpp"
이래서야 에러가 안날리가 없지 않습니까?
함수 원형이나 선언은 .h 에만 두시고 #include 는 .h 파일만 하십시오.
함수 정의는 cpp 로 빼시구요.
Person::Person() 의 구현도 Person.cpp 으로 뽑아야 합니다.
이해가 잘 안가시면 다른 좋은 C++ 서적에서 '선언' 과 '정의' 의 차이를 찾아보시기 바랍니다.
님의 코드에서는 여기저기에 Person::Person() 과 operator >> 가 중복정의되었습니다.
에러메세지도 친절히 알려주고 있군요. "multiple definition" 라고.
[quote="exsider"]마지막으로 VC++6.0을 쓰고 계신다면
맞습니다.
VC++은 ANSI C와는 약간다르더군요.
VC++7.1 쓰다가 VC++ 6.0 이것으로 바꿔 쓰고 있습니다
VC++7.1 쓰다가 VC++ 6.0 이것으로 바꿔 쓰고 있습니다
왜냐하면......
훨씬 가볍기 때문이죠 .... --;
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
개인적으로 dev C++ 도 좋아하지 않습니다gcc 그쪽 계열같아
개인적으로 dev C++ 도 좋아하지 않습니다
gcc 그쪽 계열같아서 표준에 VC++보다 부합하는줄 알았는데
VC++ 7.0보다 안좋더라고요
뭐랄까 --; 표준대로 동작을 하지 않았나? 하튼간 그랬을겁니다
[기억에는 int 인가?를 리턴해야 했는데 , return을 빼먹었죠 근데도 ,그냥 0을 리턴했던걸로 기억합니다]
지금은 바뀌었는지 모르겟지만요
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
dev-C++ 쓰고 있는데요...
윈도우 용을 설치하니까 약간 이상한 점이 처음에 있더군요. 컴파일러 위치,
include 디렉토리 위치, 링크 디렉토리 위치 등을 잘 지정해 주면 제대로
잘 돌더군요. 개인적으로는 Mingw에서 쓰고 있는데 gcc 버전이 같다면,
그 자체는 동일하게 작동하는 것 같습니다. 다른 거는 리눅스와 윈도우의
차이인 것 같구요. 현재는 gcc 3.3.3 까지 포팅이 되어 있네요...
혹, 리눅스의 gcc에서는 잘 적용되던 표준이 dev-C++에서 잘 안 되셨다면,
(아마도 mingw난 cygwin일 텐데... cygwin은 정말 겅의 동일하니까 아마도
mingw일 듯...) 환경 설정에서 디레토리나 실행 파일들 위치나 gcc 버전은
동일한 지 확인해 보시면 될 듯... 개인적으로는 사소한 걸로 무진장 애
먹었습니다. 처음에 리눅스에서는 한 방세 잘 되던 소스가 컴파일리 안 되서
황당했습니다. 정말 표준에 나오는 것들만 사용한 소스였는데... 쩝~~
저는 VC++ 은 안 써 봐서 모르겠네요. 윈도우에서는 프로그래밍을 해 본 적이
없어서, 리눅스에서 쓰던 컴파일러는 그대로 쓸 수 있어서 쓰고 있는데,
아주 만족해 하고 있습니다.
.
계속 리플이 달리네요
혹시 또 리플이 달리면 제 문제좀 해결해 주세요
제가 dev 깔았는데 윗분이 말한 그 간단한 환경설정을 못해서 결국은
리눅스에서 vi로 코딩하고 있습니다.
제가 winxp pro에다가 dev c++깔구 디버그 하려고 하는데
다음과 같은 에러가 나면서 list가 안되네요
뭐..물론 insight5 받아서 디버그문제는 해결했어요.
근데 리눅스에서는 아무 문제 없이 돌아가는 프로그램이 dev c++에선 왜 세그멘테이션 폴트가 나는거죠..
댓글 달기