2012-02-08 79 views
10

當我用C++寫了一個名爲「lotto.cpp」的小樂透程序時,我發現了一些非常奇怪的東西。一切都很好,直到我爲我的程序編寫寫入文件。當我編譯時,它給我以下錯誤:爲什麼源文件的名稱會影響編譯?

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 2012-02-08 20:02:38

+0

此外,請提供您的目錄結構(內部目錄和文件的名稱) – beta0x64 2012-02-08 20:06:30

+0

'/ usr/include/sys/errno.h'中的錯誤21是'EISDIR',你是否試圖寫入目錄? – Gaius 2012-02-08 20:04:24

回答

23

錯誤編號21(在MacOS X 10.7.2上)是EISDIR: Is a directory

名稱lotto似乎是一個目錄,而不是文件。

+0

你絕對正確的先生!我沒有意識到我有一個與我的C++文件同名的文件夾,都位於桌面。由我愚蠢的錯誤... – 2012-02-08 20:33:55

1

這是一個鏈接器錯誤,指出我們在編譯時無法寫入計算機上的「樂透」文件。我的猜測是,你的程序仍在運行,或者你不小心創建了一個名爲'lotto'的目錄。您的寫入文件功能可能會讓應用程序繼續運行,或者自己嘗試創建一個lotto目錄。

+0

這裏的代碼,因爲有些人想看看它: 編輯:代碼是太多的字符:/ – 2012-02-08 20:26:25

1

是的,我遇到了這個問題,將我的一些visual studio代碼複製到我的mac。看起來Visual Studio喜歡用您的可執行文件名稱在您的項目中創建文件夾,這會導致此問題!

0

FWIW當我試圖將輸出文件寫入尚未創建的目錄(即bin/myprogram)時,出現此錯誤。

一旦我創建了bin目錄,一切都很好;我不必重新命名任何東西。 GCC似乎創建目錄,如果它不存在,而鏗鏘(沒有至少這是我所知道的那麼近)。

相關問題