2012-02-08 3 views
10

"lotto.cpp"라고 불리는 C++에서 약간의 로또 프로그램을 만들었을 때 나는 정말 이상한 것을 보았습니다. 내 프로그램을 위해 파일 쓰기를 쓸 때까지 모든 것이 잘되었다. 우연의 일치소스 파일의 이름이 컴파일에 영향을주는 이유는 무엇입니까?

ld: can't open output file for writing: lotto, errno=21 for architecture x86_64 
collect2: ld returned 1 exit status 

, 나는이 "하여 1.cpp"내 프로그램의 이름을 변경하고, 갑자기이 문제없이 컴파일 : 내가 컴파일 할 때, 나에게 다음과 같은 오류를 보여 주었다. 또한 이름을 "test.cpp"로 변경했을 때도 효과가있었습니다.

정말 이런 일이 일어난 이유에 대해 궁금합니다. 어떤 아이디어?

이 문제는 MacBook Pro에서 발생했습니다.

코드를 원한다면 알려주세요.


일부 사람들은 코드를 묻습니다. 여기있다 :

#include <iostream> 
#include <fstream> 

using namespace std; 

const int NED = 10;    
const int VIKING = 6; 
const int NORMAL = 7; 
const int MAX = 10; 

void quickSort(int arr[], int left, int right); 
int checkDuplicates(int arr[], int length); 

int main (int argc, const char *argv[]) 
{ 
    int i, j, k, ans; 
    char ans2; 
    int lottoNumbers[MAX]; 

    ofstream out("Lotto.txt", ios::out | ios::app); 

    srand((unsigned)time(NULL));  

    do 
    { 
     do 
     { 
      cout << "\n\nDo you want to play Viking Lotto (press 6), or normal Lotto (press 7): "; 
      cin >> ans; 
     }while(ans != VIKING && ans != normal); 

     (ans == VIKING) ? cout << "\nViking Lotto:\n" : cout << "\n\nnormal Lotto:\n"; 
     (ans == VIKING) ? out << "\nViking Lotto:\n" : out << "\n\nnormal Lotto:\n"; 


     for (i = 0; i < NED; i++)  //10 rows 
     {  
      for (j = 0; j < ans; j++) //6 or 7 columns 
      { 
       (ans == VIKING) ? lottoNumbers[j] = (rand() % 48) + 1 : lottoNumbers[j] = (rand() % 34) + 1; 
      } 
      if(checkDuplicates(lottoNumbers, ans) != -1)   
      { 
       for(k = 0; k < ans; k++) 
       { 
        while(checkDuplicates(lottoNumbers, ans) == lottoNumbers[k])  
        { 
         (ans == VIKING) ? lottoNumbers[k] = (rand() % 48) + 1 : lottoNumbers[k] = (rand() % 34) + 1; 
        } 
       } 
      } 
      quickSort(lottoNumbers, 0, ans - 1); 
      cout << '\n'; 

      for(j = 0; j < ans; j++) 
      { 
       cout << lottoNumbers[j] << '\t'; 
       out << lottoNumbers[j] << '\t'; 
      } 
      out << '\n'; 

     } 
     cout << "\n\n"; 


     cout <<"Another lottery ticket (Y/N) "; 
     cin >> ans2; 
    }while(ans2 == 'j' || ans2 == 'J'); 

    cout << "\n\nLOTTO NUMBERS WAS WRITTEN TO FILE...\n\n"; 

    return 0; 
} 

void quickSort(int arr[], int left, int right) 
{ 
    int i = left, j = right; 
    int tmp; 
    int mid = arr[(left + right)/2]; 

    while (i <= j) 
    { 
     while (arr[i] < mid) i++; 
     while (arr[j] > mid) j--; 
     if (i <= j) 
     { 
      tmp = arr[i]; 
      arr[i] = arr[j]; 
      arr[j] = tmp; 
      i++; 
      j--; 
     } 
    }; 
    if (left < j) quickSort(arr, left, j); 
    if (i < right) quickSort(arr, i, right); 
} 

int checkDuplicates(int arr[], int length) 
{          
    for(int i = 0; i < length; i++) 
    { 
     for(int j = i + 1; j < length; j++) 
     { 
      if(arr[i] == arr[j]) return arr[j]; 
     } 
    } 
    return -1; 
} 
+0

코드를 입력하십시오. 권한없이 파일을 편집하는 것 같습니다. – beta0x64

+0

또한 디렉토리 구조 (디렉토리 이름과 파일 이름)를 제공하십시오. – beta0x64

+0

'/ usr/include/sys/errno.h '의 오류 21은'EISDIR'입니다. 디렉토리에 쓰려고 했습니까? – Gaius

답변

23

(맥 OS X 10.7.2)에 오류 번호 21 EISDIR: Is a directory입니다.

이름이 lotto 인 것은 파일이 아닌 디렉토리 인 것 같습니다.

+0

귀하의 절대적으로 옳은 선생님! 나는 데스크톱에있는 내 C++ 파일과 같은 이름의 폴더를 가지고 있다는 것을 깨닫지 못했습니다. 나에 의해 바보 같은 실수 ... –

1

컴파일하는 동안 컴퓨터의 'lotto'파일에 쓸 수 없다는 링커 오류입니다. 내 생각 엔 프로그램이 여전히 실행 중이거나 실수로 'lotto'라는 디렉토리를 만들었다는 것입니다. write-to-file 함수가 응용 프로그램을 실행 상태로 유지하고 있거나 자체적으로 lotto 디렉토리를 만들려고했을 가능성이 있습니다.

+0

일부 사람들이 그것을보고 싶어 이후 코드는 : 편집 : 코드가 너무 많은 문자입니다 : / –

1

그래, 내 비주얼 스튜디오 코드를 내 맥에 복사하면이 문제가 발생했다. Visual Studio에서 프로젝트 내에서 실행 파일 이름을 사용하여 폴더를 만드는 것을 좋아합니다!

0

FWIW 아직 생성되지 않은 디렉토리, 즉 bin/myprogram에 출력 파일을 쓰려고 할 때이 오류가 발생합니다.

일단 bin 디렉토리를 만들었 으면 모든 것이 좋았습니다. 나는 아무것도 이름을 다시 지어야하지 않았다. GCC는 디렉토리가 존재하지 않는다면 디렉토리를 생성하는 것처럼 보이지만, clang은 그렇지 않습니다 (최소한 내가 말할 수있는 것만 큼).

관련 문제