2012-03-08 43 views
5

tôi đang làm điều này:Viết dòng vào một tập tin bằng C

FILE *fOut; 
fOut = fopen("fileOut.txt", "w"); 
char line[255]; 
... 
strcat(line, "\n"); 
fputs(line, fOut); 

nhưng thấy rằng khi tôi mở tập tin trong một trình soạn thảo văn bản tôi nhận được

line 1 

line 2 

Nếu tôi loại bỏ các strcat (dòng, "\ n"); sau đó tôi nhận được.

line 1line2 

Làm thế nào để tôi nhận được fout là

line 1 
line 2 
+0

Chỉ tò mò: bạn đang điền vào dòng 'trước khi nối thêm dòng mới như thế nào? –

+0

Xác định "Tôi nhận được". Bạn phân tích nội dung tệp như thế nào? –

+0

@torrentialcoding Tôi thực sự lặp qua một tệp mã hóa từng dòng và sau đó viết dòng đó vào một tệp mới. – Dunc

Trả lời

0

Bạn có thể thử sử dụng \r thay vì \n. Bạn đang chạy nền tảng nào trên Windows?

2

Khi tệp được mở bằng w (hoặc wt) Windows thay thế \n bằng \r\n.

Để tránh điều này, hãy mở tệp với wb (thay vì w).

... 
fOut = fopen("fileOut.txt", "wb"); 
... 

Không giống như nhiều hệ điều hành khác, Windows phân biệt giữa chế độ nhị phân và văn bản và - gây khó chịu - thời gian chạy Windows C xử lý cả hai chế độ khác nhau.

+0

Chỉ cần thêm vào điều này, 'fputs' đã thêm một dòng mới, do đó không cần phải thêm một dòng mới. –

+2

@Mike Kwan: ​​Cảm ơn bạn đã bình luận. Tôi tin rằng bạn có nghĩa là 'đặt' nối thêm một dòng mới. AFAICT 'fputs' không. Liên kết: http://www.cplusplus.com/reference/clibrary/cstdio/puts/ – bernie

+0

@MikeKwan: ​​Không; 'puts()' chắp thêm một dòng mới; 'fputs()' không thêm một dòng mới. Tương tự, 'gets()' loại bỏ một dòng mới; 'fgets()' không xóa một dòng mới. –

3

Chức năng puts() nối thêm dòng mới vào chuỗi được viết để ghi vào stdout; chức năng fputs() không làm điều đó.

Vì bạn không hiển thị cho chúng tôi tất cả mã, chúng tôi chỉ có thể đưa ra giả thuyết về những gì bạn đã làm. Nhưng:

strcpy(line, "line1"); 
fputs(line, fOut); 
putc('\n', fOut); 
strcpy(line, "line2\n"); 
fputs(line, fOut); 

sẽ tạo ra những kết quả mà bạn yêu cầu, theo hai cách hơi khác nhau mà mỗi có thể được sử dụng hai lần để đạt được sự nhất quán (và mã của bạn phải nhất quán — nghỉ 'biến thanh lịch' để viết tài liệu của bạn, không cho lập trình của bạn).


Trong một bình luận, bạn nói:

Tôi thực sự lặp thông qua một tập tin mã hóa mỗi dòng và sau đó viết rằng dòng vào một tập tin mới.

Oh boy! Bạn có mã hóa cơ sở dữ liệu mã hóa 64 không? Nếu không, sau đó:

  1. Bạn phải bao gồm b trong fopen() chế độ (như trong fOut = fopen("fileout.bin", "wb");) vì dữ liệu được mã hóa là dữ liệu nhị phân, không phải dữ liệu văn bản. Điều này (các b) là an toàn cho cả Unix và Windows, nhưng là rất quan trọng trên Windows và không quan trọng trên Unix.
  2. Bạn không được sử dụng fputs() để ghi dữ liệu; sẽ không có byte ('\0') trong số các giá trị được mã hóa và fputs() sẽ dừng ở đầu tiên của các giá trị mà nó gặp phải. Bạn có thể cần phải sử dụng fwrite() thay vào đó, cho biết chính xác số byte cần viết mỗi lần.
  3. Bạn không được chèn dòng mới vào bất kỳ đâu; dữ liệu được mã hóa có thể chứa các dòng mới, nhưng các dữ liệu đó phải được giữ nguyên và không thể thêm vào một liên kết không liên quan.
  4. Khi bạn đọc tệp này trở lại, bạn phải mở tệp đó dưới dạng tệp nhị phân "rb" và đọc tệp bằng cách sử dụng fread().

Nếu bạn mã hóa cơ sở dữ liệu mã hóa 64, thì bạn có thể quay lại xử lý đầu ra dưới dạng văn bản; đó là điểm của mã hóa base-64.

+0

Điều này không hoạt động hoặc – Dunc

+2

@Dunc: Bạn không thể ít hữu ích hơn là chỉ nói" điều này không hiệu quả ". **Chuyện gì đã xảy ra? * Bạn đã quan sát điều gì? *** –

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