2013-04-08 32 views
8

Tôi đang cố đọc một tệp vào bộ nhớ trong chương trình Fortran. Tệp có N hàng có hai giá trị trong mỗi hàng. Đây là những gì tôi đang làm (nó biên dịch và chạy, nhưng mang lại cho tôi kết quả không chính xác):Fortran đọc tệp thành các tham số mảng - transposed

program readfromfile 
    implicit none 

    integer :: N, i, lines_in_file 
    real*8, allocatable :: cs(:,:) 

    N = lines_in_file('datafile.txt') ! a function I wrote, which works correctly 

    allocate(cs(N,2)) 

    open(15, 'datafile.txt', status='old') 
    read(15,*) cs 

    do i=1,N 
     print *, cs(i,1), cs(i,2) 
    enddo 

end 

Những gì tôi hy vọng để có được được các dữ liệu được nạp vào biến cs, với những đường nét như chỉ mục và cột đầu tiên là thứ hai, nhưng khi mã trên chạy, trước tiên nó cung cấp cho các bản in một dòng có hai giá trị "cột bên trái", sau đó một dòng có hai giá trị "cột bên phải", sau đó một dòng có hai "giá trị cột bên trái" tiếp theo, v.v.

Dưới đây là một mô tả trực quan hơn của tình hình:

In my data file:  Desired output:  Actual output: 
A1 B1    A1 B1    A1 A2 
A2 B2    A2 B2    B1 B2 
A3 B3    A3 B3    A3 A4 
A4 B4    A4 B4    B3 B4 

Tôi đã thử chuyển đổi các chỉ số khi phân bổ cs, nhưng với kết quả tương tự (hoặc segfault, tùy thuộc vào thời tiết Tôi cũng chuyển chỉ số tại in tuyên bố). Tôi cũng đã cố gắng đọc các giá trị theo từng hàng, nhưng vì định dạng bất thường của tệp dữ liệu (được phân cách bằng dấu phẩy, không được căn chỉnh theo cột), tôi không thể làm việc này được.

Làm cách nào để đọc dữ liệu vào bộ nhớ cách tốt nhất để đạt được kết quả mà tôi muốn?

Trả lời

9

Tôi không thấy bất kỳ dấu phẩy nào trong tệp dữ liệu của bạn. Tuy nhiên, không nên tạo bất kỳ sự khác biệt nào với đầu vào theo danh sách. Chỉ cần đọc nó như bạn viết nó.

do i=1,N 
    read (*,*) cs(i,1), cs(i,2) 
enddo 

Nếu không, nếu bạn đọc toàn bộ mảng trong một lệnh, nó đọc nó theo thứ tự cột lớn, ví dụ: cs(1,1), cs(2, 1), ....cs(N,1), cs(1, 2), cs(2,2), ... Đây là thứ tự trong đó mảng được lưu trữ trong bộ nhớ.

+0

Tôi ngạc nhiên trước lý do tại sao tôi không thể làm việc này trước đây, nhưng bây giờ. Cảm ơn! Về dấu phẩy trong tệp đầu vào của tôi, chúng có trong tệp thực tế, nhưng trong ví dụ tôi chỉ muốn hình dung thứ tự của các phần tử. –

+0

Và một upvote cho lời giải thích lý do tại sao nó đã làm những gì nó đã làm khi nó không được làm việc. Thêm đại diện cho bạn, thưa bạn! =) –

+1

Đối với người đọc trong tương lai của bài đăng này: Tôi muốn tổng quát đọc cho một chương trình con chỉ lấy tên tệp và số hàng và cols để đọc và kết thúc bằng ngầm định sau làm cấu trúc: 'read (f, *) ((cs (hàng, col), col = 1, Ncols), hàng = 1, Nrows) '. Lưu ý rằng các cột phải nằm trong vòng lặp bên trong, vì các lý do được đề cập bởi @Vladimir F trong câu trả lời ở trên. –

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