2012-11-21 32 views
7

Tôi đang làm việc trên một chương trình C đơn giản để mở một tệp và đọc một số dữ liệu từ đó. Không có lỗi biên dịch, nhưng khi tôi chạy chương trình trên một tệp nhất định, tôi nhận được lỗi "Phân đoạn lỗi: mã đã bị bán phá giá". Tôi đã chèn một câu lệnh in ở đầu mã của tôi, và nó không chạy. Có thể nhận được lỗi phân đoạn khi bạn chưa thực hiện bất kỳ điều gì không?Lỗi phân đoạn trước dòng mã đầu tiên

#include <stdio.h> 


int main(int argc, char **argv) 
{ 
    printf("%s", "Made it to here!"); 
FILE *fp; 
char input[100]; 
fp = fopen(argv[1], "r+b"); 
fgets(input, sizeof(input), fp); 
printf("%s", input); 
fclose(fp); 
return(0); 

} 

Điều này hoạt động khi tôi chạy trên phiên bản văn bản của chính nó, nó in ra dòng đầu tiên. Tuy nhiên, khi tôi chạy nó trên một tập tin khác, texttest.vmf, tôi nhận được lỗi phân đoạn và in đầu tiên không thực thi. VMF là các tệp bản đồ Valve, nhưng chúng ở định dạng văn bản chuẩn. Tệp này có dung lượng lớn khoảng 3,7 KB. Bất kỳ ý tưởng?

+1

Bạn nên làm theo câu trả lời dưới đây, rất có thể vấn đề là bạn không kiểm tra sự trở lại của fopen để xem nếu có lỗi. –

Trả lời

17

Nó không phải là cần thiết rằng mã của bạn thất bại trước printf: cuộc gọi đến printf có thể đã thành công, nhưng vì đầu ra để an ủi là đệm, chương trình có thể đã bị rơi trước khi đầu ra đã được ghi vào màn hình.

Thêm \n vào chuỗi đầu ra làm cho bộ đệm điều khiển bị tuôn ra. Nếu bạn đang tìm cách gỡ lỗi theo printf s, bạn nên luôn thêm \n vào cuối chuỗi định dạng của mình.

1

Cuộc gọi fopen của bạn có khả năng không thành công. Hãy thử kiểm tra giá trị trả về trước khi bạn cố gắng sử dụng fp:

FILE *fp; 
char input[100]; 
if((fp = fopen(argv[1], "r+b") == NULL) { 
    fprintf(stderr, "ERROR: Cannot open file.\n"); 
    return 1; 
} 

Hãy chắc chắn để thêm #include <stdlib.h> cho việc sử dụng các macro NULL.

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