2013-02-04 25 views
5

Tuyên bố từ chối trách nhiệm: đây là một bài tập. Tôi không yêu cầu mã rõ ràng. Thay vào đó, tôi chỉ yêu cầu đủ sự giúp đỡ để tôi có thể hiểu được vấn đề của mình và tự sửa nó.Tệp IO dường như không đọc chính xác

Tôi đang cố gắng tạo lại tiện ích Unix ar theo bài tập về nhà. Phần lớn nhiệm vụ này đề cập đến tệp IO trong C và các phần khác xử lý các cuộc gọi hệ thống, v.v.

Trong trường hợp này, tôi dự định tạo một danh sách đơn giản của tất cả các tệp trong lưu trữ. Tôi đã không đi xa, như bạn có thể nhận thấy. Kế hoạch tương đối đơn giản: đọc từng tiêu đề tệp từ tệp lưu trữ và chỉ in giá trị được giữ trong ar_hdr.ar_name. Phần còn lại của các trường sẽ bị bỏ qua qua fseek(), bao gồm dữ liệu tệp, cho đến khi một tệp khác được tiếp cận, tại thời điểm đó quá trình bắt đầu lại. Nếu đạt được EOF, hàm chỉ đơn giản chấm dứt.

Tôi có ít kinh nghiệm với tệp IO, vì vậy tôi đã gặp bất lợi với nhiệm vụ này. Tôi đã cố hết sức để nghiên cứu những cách thức phù hợp để đạt được mục tiêu của mình, và tôi tin rằng tôi đã thực hiện chúng theo khả năng tốt nhất của tôi. Điều đó nói rằng, có vẻ như đã xảy ra sự cố với việc triển khai của tôi. Dữ liệu từ tệp lưu trữ dường như không được đọc hoặc ít nhất được lưu trữ dưới dạng biến. Đây là mã của tôi:

struct ar_hdr 
{ 
    char ar_name[16]; /* name */ 
    char ar_date[12]; /* modification time */ 
    char ar_uid[6];  /* user id */ 
    char ar_gid[6];  /* group id */ 
    char ar_mode[8]; /* octal file permissions */ 
    char ar_size[10]; /* size in bytes */ 
}; 

void table() 
{ 
    FILE *stream; 
    char str[sizeof(struct ar_hdr)]; 
    struct ar_hdr temp; 

    stream = fopen("archive.txt", "r"); 
    if (stream == 0) 
    { 
     perror("error"); 
     exit(0); 
    } 

    while (fgets(str, sizeof(str), stream) != NULL) 
    { 
     fscanf(stream, "%[^\t]", temp.ar_name); 
     printf("%s\n", temp.ar_name); 
    } 
    if (feof(stream)) 
    { 
     // hit end of file 
     printf("End of file reached\n"); 
    } 
    else 
    { 
     // other error interrupted the read 
     printf("Error: feed interrupted unexpectedly\n"); 
    } 

    fclose(stream); 
} 

Tại thời điểm này, tôi chỉ muốn có thể đọc dữ liệu chính xác. Tôi sẽ làm việc để tìm kiếm tập tin tiếp theo sau khi kết thúc. Tuy nhiên, tôi muốn nhắc lại quan điểm của mình rằng tôi không yêu cầu mã rõ ràng - tôi cần phải tìm hiểu công cụ này và nhờ ai đó cung cấp cho tôi mã làm việc sẽ không làm điều đó.

+2

+1 để viết theo cách làm giảm bớt nhu cầu cho tất cả nhận xét "blah-blah về bài tập về nhà". – ChiefTwoPencils

Trả lời

3

Bạn đã xác định bộ đệm char có tên str để giữ dữ liệu, nhưng bạn đang truy cập vào bộ nhớ riêng từ cấu trúc riêng biệt ar_hdr có tên temp. Đồng thời, bạn đang đọc dữ liệu nhị phân dưới dạng chuỗi sẽ phá vỡ vì các giá trị được nhúng.

Bạn cần phải đọc dữ liệu như nhị phân và một trong hai thay đổi temp là một con trỏ đến str hoặc đọc trực tiếp vào temp sử dụng một cái gì đó như:

ret=fread(&temp,sizeof(temp),1,stream); 

(nhìn vào doco cho fread - C của tôi là quá gỉ để chắc chắn về điều đó). Đảm bảo bạn kiểm tra và sử dụng giá trị trả lại.

+1

Tôi nghĩ * anh ta đang cố gắng đọc toàn bộ tiêu đề vào 'str', sau đó kéo dữ liệu từ đó vào cấu trúc' temp' của anh ta? –

+1

@Brian: Có thể; Tôi đang cố gắng cho anh ta những gợi ý mà anh ta cần. –

+0

@SoftwareMonkey: Brian đúng, đó là ý định của tôi. Tôi sẽ có một đâm vào người đàn ông cho fread và xem những gì thay đổi tôi cần phải thực hiện. Tôi đã không xem xét khả năng của nulls nhúng. Tôi dự định sử dụng fseek() để bỏ qua tất cả mọi thứ trừ thông tin tiêu đề, vì vậy trừ khi có giá trị null được nhúng trong đó, đây sẽ là một vấn đề nghiêm trọng, chạy vào các null được nhúng không phải là vấn đề, đúng không? – idigyourpast

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