책보면서 visual C++ 에서 코딩하는데 strstream.h 이 없는데 어

quintus의 이미지

책에 있는 소스에는 strstream.h 을 include 하라고 하는데 visual c++ include 디렉토리에 보니까 strstream 밖에 없는데 이럴땐 어떻게 해야하죠? 그냥 #include <strstream> 이렇게 쓰면 되는건가요? 그렇게 했더니 계속 에러 나던데. 제가 vc++ 첨써봐서 모르거든요.

monpetit의 이미지

에러 메시지를 올려 주세요.

uchi의 이미지

using namespace std;
아마도... include밑에 이걸 적어주시면...

quintus의 이미지

아. 찾았습니다

Quote:
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;
	}
}

// writeper.cpp
#include <iostream.h>
#include "person.h"

ostream & operator << (ostream & stream, Person & p)
{ // insert fields into file
	stream<< "Last Name  '" << p.LastName <<"'\n"
		<< "First Name '" << p.FirstName <<"'\n"
		<< "Address    '" << p.Address <<"'\n"
		<< "City       '" << p.City <<"'\n"
		<< "State      '" << p.State <<"'\n"
		<< "Zip Code   '" << p.ZipCode <<"'\n"
		<<flush;
	return stream;
}

// 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
불량청년의 이미지

KLDP에서 'L'자가 뭔지 아십니까?

질문은 질문할 곳을 찾아가며 해야합니다.

어디가서 해야할지 모르겠다면 www.devpia.com 으로 가보세요.

기본적인 프로그래밍 질문이나 개념적 질문이라면 이해가 가겠지만,

질문이 VC++환경에 대한 질문아닙니까?

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

exsider의 이미지

Quote:
#include <iostream.h>
#include <fstream.h>
#include <string.h>

등은 전부

Quote:
#include <iostream>
#include <fstream>
#include <string>

으로 바꾸세요. 이것이 표준입니다.

그리고 표준라이브러리에 들어있는 것(string, cout 등)은 전부 std namespace에 들어있습니다. 따라서 std::string , std::cout 과 같은 식으로
바꾸던지, 아니면 include 아래에

Quote:
using namespace std;

를 추가하면 됩니다.

마지막으로 VC++6.0을 쓰고 계신다면 컴파일러를 다른 것으로 바꾸시기 바랍니다.
제 생각에는 그리좋은 컴파일러가 아닌 것 같습니다.
MFC같은게 필요한게 아니라면 DEV-C++을 추천합니다.

죠커의 이미지

exsider wrote:
마지막으로 VC++6.0을 쓰고 계신다면 컴파일러를 다른 것으로 바꾸시기 바랍니다.
제 생각에는 그리좋은 컴파일러가 아닌 것 같습니다.

객관적으로 봐도 VC++6.0은 나쁜 컴파일러입니다. :-) Visual Studio.net 2003이나 Dev-C++을 쓰세요.

그리고 iostream.h가 나온다면 그 책도 나쁩니다. 그 책의 최신판을 찾아보시던지 다른 책을 보십시요.

버려진의 이미지

vc++6.0이 dev-c++보다 좋은 점이라면 컴파일 속도죠 :)

오래된 책을 보시는것 같은데... 잠시 덮어두고 다른책을 보시는게 어떨까 싶습니다.

quintus의 이미지

제가 비주얼 C++을 첨 써보는데 어디다 질문 해야 할지 몰라서 여기다 질문 하게 되었습니다. 얼굴이 달아오르긴 했지만..(그것도 모르냐는 말에. 좀 챙피하네요) 뭐 그래도 앞으론 KLDP의 L자가 뭔지는 잊어버리지 않을거 같습니다.

그리고. 제가 보는 책이 오래된 책이 맞나봅니다. file structure - michael J. folk, bill zoellick, greg riccardi 인데 책에 나온 소스를 dev c++에서도 돌려봤는데 안 되길래, visual C++ 깔고 돌려본거 였거든요. 제 질문은 헤더파일을 어떻게 고쳐야 하는가.였는데, vc++6 얘기가 나올줄은 몰랐습니다.

그래도 하루종일 왜 안되지 하고 있었는데 답변 달아 줘서 감사합니다~

그런데 여전히 안되네요.

lsj0713의 이미지

최근에 MS에서 C++ 컴파일러를 공개한 것은 아시리라 믿습니다.

http://msdn.microsoft.com/visualc/vctoolkit2003/

잠깐 돌려봤는데 표준 C++ 예제 정도 돌리는 정도라면 컴파일 속도도 빠르고 쓸만하더군요. 그러나 이상하게도 WinAPI는 지원을 안하더군요. SDK를 깔아야 된다나 뭐라나...

참고삼아 말씀드리면 제가 컴파일할때 쓰는 옵션은 예제 파일에 나와있는 그대로인 cl /EHsc filename.c 입니다.

Testors의 이미지

우선 strstream 과 아무 관계가 없는 에러입니다.

#include "writeper.cpp"

이래서야 에러가 안날리가 없지 않습니까?

함수 원형이나 선언은 .h 에만 두시고 #include 는 .h 파일만 하십시오.
함수 정의는 cpp 로 빼시구요.
Person::Person() 의 구현도 Person.cpp 으로 뽑아야 합니다.
이해가 잘 안가시면 다른 좋은 C++ 서적에서 '선언' 과 '정의' 의 차이를 찾아보시기 바랍니다.

님의 코드에서는 여기저기에 Person::Person() 과 operator >> 가 중복정의되었습니다.
에러메세지도 친절히 알려주고 있군요. "multiple definition" 라고.

lkjt의 이미지

exsider wrote:
마지막으로 VC++6.0을 쓰고 계신다면 컴파일러를 다른 것으로 바꾸시기 바랍니다.
제 생각에는 그리좋은 컴파일러가 아닌 것 같습니다.

맞습니다.
VC++은 ANSI C와는 약간다르더군요.

mastercho의 이미지

VC++7.1 쓰다가 VC++ 6.0 이것으로 바꿔 쓰고 있습니다

왜냐하면......

훨씬 가볍기 때문이죠 .... --;

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

mastercho의 이미지

개인적으로 dev C++ 도 좋아하지 않습니다

gcc 그쪽 계열같아서 표준에 VC++보다 부합하는줄 알았는데

VC++ 7.0보다 안좋더라고요

뭐랄까 --; 표준대로 동작을 하지 않았나? 하튼간 그랬을겁니다

[기억에는 int 인가?를 리턴해야 했는데 , return을 빼먹었죠 근데도 ,그냥 0을 리턴했던걸로 기억합니다]

지금은 바뀌었는지 모르겟지만요

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

azoth의 이미지

mastercho wrote:
개인적으로 dev C++ 도 좋아하지 않습니다

gcc 그쪽 계열같아서 표준에 VC++보다 부합하는줄 알았는데

VC++ 7.0보다 안좋더라고요

뭐랄까 --; 표준대로 동작을 하지 않았나? 하튼간 그랬을겁니다

[기억에는 int 인가?를 리턴해야 했는데 , return을 빼먹었죠 근데도 ,그냥 0을 리턴했던걸로 기억합니다]

지금은 바뀌었는지 모르겟지만요

윈도우 용을 설치하니까 약간 이상한 점이 처음에 있더군요. 컴파일러 위치,
include 디렉토리 위치, 링크 디렉토리 위치 등을 잘 지정해 주면 제대로
잘 돌더군요. 개인적으로는 Mingw에서 쓰고 있는데 gcc 버전이 같다면,
그 자체는 동일하게 작동하는 것 같습니다. 다른 거는 리눅스와 윈도우의
차이인 것 같구요. 현재는 gcc 3.3.3 까지 포팅이 되어 있네요...

혹, 리눅스의 gcc에서는 잘 적용되던 표준이 dev-C++에서 잘 안 되셨다면,
(아마도 mingw난 cygwin일 텐데... cygwin은 정말 겅의 동일하니까 아마도
mingw일 듯...) 환경 설정에서 디레토리나 실행 파일들 위치나 gcc 버전은
동일한 지 확인해 보시면 될 듯... 개인적으로는 사소한 걸로 무진장 애
먹었습니다. 처음에 리눅스에서는 한 방세 잘 되던 소스가 컴파일리 안 되서
황당했습니다. 정말 표준에 나오는 것들만 사용한 소스였는데... 쩝~~

저는 VC++ 은 안 써 봐서 모르겠네요. 윈도우에서는 프로그래밍을 해 본 적이
없어서, 리눅스에서 쓰던 컴파일러는 그대로 쓸 수 있어서 쓰고 있는데,
아주 만족해 하고 있습니다.

quintus의 이미지

계속 리플이 달리네요
혹시 또 리플이 달리면 제 문제좀 해결해 주세요

제가 dev 깔았는데 윗분이 말한 그 간단한 환경설정을 못해서 결국은
리눅스에서 vi로 코딩하고 있습니다.

제가 winxp pro에다가 dev c++깔구 디버그 하려고 하는데
다음과 같은 에러가 나면서 list가 안되네요

(gdb) list 
list 
22 //c/dev-c++/hw3/hw3a.c: No such file or directory. 
(gdb)

뭐..물론 insight5 받아서 디버그문제는 해결했어요.

근데 리눅스에서는 아무 문제 없이 돌아가는 프로그램이 dev c++에선 왜 세그멘테이션 폴트가 나는거죠..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.