2012-02-08 23 views
10

Tôi bắt gặp một cái gì đó thực sự kỳ lạ khi tôi viết một chương trình xổ số nhỏ trong C++ được gọi là "lotto.cpp". Mọi thứ đều ổn cho đến khi tôi viết file ghi cho chương trình của mình. Khi tôi biên soạn, nó chỉ cho tôi những lỗi sau:Tại sao tên của tệp nguồn ảnh hưởng đến biên dịch?

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

Bằng cách trùng hợp ngẫu nhiên, tôi đã thay đổi tên của chương trình của tôi để "1.cpp", và tất cả của một đột ngột nó biên dịch không có vấn đề. Nó cũng làm việc khi tôi đổi tên thành "test.cpp".

Tôi thực sự tò mò là tại sao điều này lại xảy ra. Bất kỳ ý tưởng?

Điều này đã xảy ra trên MacBook Pro.

Nếu bạn muốn mã, hãy cho tôi biết!


Tôi biết một số người đã yêu cầu mã. Dưới đây là:

#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

Vui lòng cung cấp mã. Có vẻ như bạn đang chỉnh sửa tệp mà không có quyền. – beta0x64

+0

Ngoài ra, vui lòng cung cấp cấu trúc thư mục của bạn (tên của thư mục và tệp bên trong) – beta0x64

+0

Lỗi 21 trong '/ usr/include/sys/errno.h' là' EISDIR', bạn đang cố viết thư mục? – Gaius

Trả lời

23

Lỗi số 21 (trên MacOS X 10.7.2) là EISDIR: Is a directory.

Tên lotto có vẻ là một thư mục chứ không phải tệp.

+0

Bạn hoàn toàn đúng của bạn! Tôi không nhận ra rằng tôi có một thư mục có cùng tên với tệp C++ của tôi, cả hai đều nằm trong Máy tính để bàn. Lỗi lầm ngớ ngẩn của tôi ... –

1

Đây là lỗi liên kết tuyên bố rằng chúng tôi không thể ghi vào tệp 'xổ số' trên máy tính của bạn trong khi biên dịch. Tôi đoán là chương trình của bạn vẫn đang chạy, hoặc bạn vô tình tạo ra một thư mục có tên là 'lotto'. Có thể chức năng ghi vào tập tin của bạn đang giữ cho ứng dụng đang chạy, hoặc chính nó đã cố gắng tạo một thư mục xổ số.

+0

Đây là mã do một số người muốn xem nó: Chỉnh sửa: Mã quá nhiều ký tự: / –

1

Vâng tôi đã gặp sự cố này bằng cách sao chép một số mã studio trực quan của tôi vào mac của mình. Có vẻ như Visual Studio thích tạo thư mục bên trong dự án của bạn với tên thực thi của bạn gây ra điều này!

0

FWIW Tôi gặp lỗi này khi cố gắng ghi tệp đầu ra của mình vào một thư mục chưa được tạo, tức là bin/myprogram.

Khi tôi đã tạo thư mục bin, mọi thứ đều ổn; Tôi không phải đổi tên bất cứ thứ gì. GCC dường như tạo ra các thư mục nếu nó không tồn tại, trong khi clang không (ít nhất là thats gần như tôi có thể nói).

Các vấn đề liên quan