문제

여기 거래가 있습니다. 저는 대학에서 C ++ 클래스에 소개를 받고 파일 확장을 변경하는 방법을 알아내는 데 어려움을 겪고 있습니다. 첫째, 우리가해야 할 일은 .txt 파일로 읽고 단어, 문장, 모음 등을 계산하는 것입니다. 글쎄요, 다음 단계는 나를 괴롭히는 것입니다. 그런 다음 입력 파일과 동일한 파일 이름을 사용하여 새 파일을 작성하지만 .txt 대신 확장자 .code를 사용한다고 가정합니다 (새 파일에서는 각각의 ASCII 코드에 임의 숫자를 추가하여 문자열을 인코딩해야합니다. 관심이 있다면 캐릭터). 프로그래밍의 초보자이기 때문에 어떻게 해야할지 잘 모르겠습니다. 처음에는 입력 파일을 얻기 위해 다음 코드를 사용하고 있습니다.

cout << "Enter filename: ";
cin >> filename;
infile.open(filename.c_str());

새 파일을 작성한다고 가정하고 있습니다.

outfile.open("test.code");

그러나 사용자가 입력 할 때까지 파일 이름이 무엇인지 알지 못하므로 "test.txt"라고 말할 수 없습니다. 따라서 새 파일을 만들 때 연장을 변경하는 방법을 아는 사람이 있다면 대단히 감사하겠습니다!

도움이 되었습니까?

해결책

이것에 대한 몇 가지 접근법이 있습니다.

슈퍼 게으른 접근 방식을 취하고 .txt 확장자가 아닌 파일 이름 만 입력 할 수 있습니다. 이 경우 입력 파일을 열도록 .txt를 추가 할 수 있습니다.

infile.open(filename + ".txt");

그럼 당신은 그냥 전화합니다

outfile.open(filename + ".code");

다음 접근 방식은 Extension을 포함한 전체 파일 이름을 가져 와서 .code를 추가하여 Test.txt.code를 가리키는 것입니다.

이것이 허용되는지 아닌 경우 약간 모호합니다.

마지막으로 사용할 수 있습니다 std::string 행동 양식 find, 그리고 replace 확장자가없는 파일 이름을 얻고 사용합니다.

다른 팁

나는 때때로이 질문을 하고이 페이지에서 끝납니다. 따라서 향후 참조를 위해 다음은 다음과 같습니다.

string newfilename=filename.substr(0,filename.find_last_of('.'))+".code";

물론, 이것이 숙제가 아니라 실제 프로젝트라면, 당신은 아마도 당신의 코드를 읽는 다른 사람들뿐만 아니라 스스로 할 것입니다. boost.filesystem'에스 replace_extension() 자신을 굴리는 대신. 적어도 일부 코너 케이스에서는 버그를 만들 수 없을 정도로 간단한 기능이 없습니다.

학습은 운동의 요점이기 때문에 그것을 포기하지 않지만 여기에 힌트가 있습니다. 당신은 아마도 조합을 원할 것입니다 find_last_of 그리고 replace.

다음은 몇 가지 힌트입니다. 당신은 이미 파일 이름을 입력했습니다.

std::string basename(const std::string &filename)
{
  // fill this bit in
}

해당 기능을 작성한 후 새 파일의 이름을 만들기 위해 사용할 수 있습니다.

std::string codeFile = basename(filename) + ".code";
outFile.open(codeFile);

의사 코드는 같은 일을하는 것입니다

outFilename = filename;
<change outFilename>
outfile.open(outFilename);

Outfilename을 변경하려면 strrchr와 strcpy를 출발점으로보십시오 (더 적절한 방법 일 수 있습니다.

창에서 (적어도)에서 사용할 수 있습니다 _splitpath 나머지 조각에서 기본 이름을 해부 한 다음 좋아하는 문자열 Formatter를 사용하여 다시 조립하십시오.

문자열 메소드를 사용하지 않는 이유는 무엇입니까? find_last_of() ?

std::string new_filename = filename;
size_type result = new_filename.find_last_of('.');

// Does new_filename.erase(std::string::npos) working here in place of this following test?
if (std::string::npos != result)
    new_filename.erase(result);

// append extension:
filename.append(".code");

나는 사용자가 입력 한 파일 이름에 ".code"를 추가 할 것입니다. "test.txt"를 입력 한 경우 출력 파일은 "test.txt.code"입니다. "테스트"와 같이 확장자가없는 파일 이름을 입력 한 경우 출력 파일은 "Test.Code"입니다.

이 기술을 항상 출력 파일과 관련 로깅/진단 출력을 생성하는 프로그램과 함께 사용합니다. 구현하기가 간단하고 제 생각에는 파일 간의 관계를 훨씬 더 명확하게 만듭니다.

strstr를 사용하는 것은 어떻습니까 :

char* lastSlash;
char* newExtension = ".code";
ChangeFileExtension(char* filename) {
    lastSlash = strstr(filename, ".");
    strcpy(lastSlash, newExtension);
}

당신이해야 할 일은 원래 파일 이름을 새로운 변수로 복사하여 확장자를 변경할 수 있습니다. 이 같은:

string outFilename;
size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
    // Copy everything up to (but not including) the '.'
    outFilename.assign(filename, 0, extPos);
    // Add the new extension.
    outFilename.append(".code");
    // outFilename now has the filename with the .code extension.
}

나중에 사용하기 위해 원래 파일 이름을 보관할 필요가 없다면 "파일 이름"변수를 사용할 수 있습니다. 이 경우 사용할 수 있습니다.

size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
    // Erase the current extension.
    filename.erase(extPos);
    // Add the new extension.
    filename.append(".code");
}

핵심은 C ++ 문자열 클래스의 정의를보고 각 멤버 기능이 무엇을하는지 이해하는 것입니다. rfind를 사용하면 문자열을 통해 뒤로 검색하면 원래 파일 이름의 일부일 수있는 폴더 이름 (예 : "c : mystuff.school myfile.txt")의 폴더 이름에서 실수로 내선을 누르지 않습니다. Find, Rfind 등의 오프셋으로 작업 할 때는 다른 방법으로 카운트로 전달할 때 올바르게 사용하도록 조심해야합니다 (예 : 할당 (Filename, 0, Extpos-1), 할당을 사용합니까? (filename, 0, extpos), 할당 (filename, 0, extpos+1)).

도움이되기를 바랍니다.

size_t pos = filename.rfind('.');
if(pos != string::npos)
    filename.replace(pos, filename.length() - pos, ".code");
else
    filename.append(".code");

아주 쉽게:

string str = "file.ext";

str[str.size()-3]='a';
str[str.size()-2]='b';
str[str.size()-1]='c';

cout<<str;

결과 : "file.abc"

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top