2012-02-08 3 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

+0

Кроме того, пожалуйста, укажите структуру своего каталога (имя файла и файлов внутри) – beta0x64

+0

Ошибка 21 в '/ usr/include/sys/errno.h' является' EISDIR', вы пытались записать в каталог? – Gaius

ответ

23

Номер ошибки 21 (на MacOS X 10.7.2) является EISDIR: Is a directory.

Имя lotto похоже, является каталогом, а не файлом.

+0

Совершенно верно, сэр! Я не понял, что у меня есть папка с тем же именем, что и мой файл C++, оба находятся на рабочем столе. Глупая ошибка у меня ... –

1

Это ошибка компоновщика, которая заявляет, что мы не можем писать в файл «lotto» на вашем компьютере во время компиляции. Я предполагаю, что либо ваша программа все еще работает, либо вы случайно создали каталог под названием «lotto». Возможно, ваша функция write-to-file поддерживает запуск приложения или сама пытается создать каталог лото.

+0

Вот код, так как некоторые люди хотели бы посмотреть на него: Редактировать: код слишком много символов: / –

1

Да, я столкнулся с этой проблемой, скопировав часть моего визуального кода студии на свой Mac. Кажется, Visual Studio любит создавать папки внутри вашего проекта с вашим исполняемым именем, которое вызывает это!

0

FWIW У меня возникла эта ошибка, когда я пытался записать выходной файл в каталог, который еще не был создан, т. Е. Bin/myprogram.

Как только я создал каталог bin, все было в порядке; Мне не нужно было переименовывать что-либо. Кажется, что GCC создает каталог, если он не существует, тогда как clang не (по крайней мере, так близко, как я могу сказать).

Смежные вопросы