[英]Read file block by block in C
我想完全按原樣將file1的內容復制到file2(保留空格和換行符)。 我特意想一次將這些內容復制一小塊字符(這是一個較大項目的一小段,所以請耐心等待)。
我嘗試過以下方法:
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
int main(int argc, char *argv[]) {
FILE *fin, *fout;
char buffer[MAX];
int length;
char c;
if((fin=fopen(argv[1], "r")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
if((fout=fopen(argv[2], "w")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
while(1){
length = 0;
while((c = fgetc(fin)) != EOF && length < MAX){
buffer[length++] = (char) c;
}
if(length == 0){
break;
}
fprintf(fout, "%s", buffer);
}
fclose(fout);
fclose(fin);
}
但是,這會導致錯誤輸出到我的文件2。 任何輸入將不勝感激。
您的緩沖區不是零終止的。 使用fwrite而不是fprintf:
fwrite(buffer, 1, length, fout);
你也應該檢查錯誤。 因此,將fwrite
返回碼與length
進行比較,如果不同,則重試寫入剩余字節(如果為正)或通過perror("fwrite")
打印相應的錯誤消息(如果返回碼為負)。
另外,您可以考慮以二進制模式打開文件,這會導致窗口不同,即將"rb"
和"wb"
傳遞給fopen
。
最后但並非最不重要的是,不要一次循環並獲取一個字符,而是考慮使用fread
:
length = fread(buffer, 1, MAX, fin);
這是一個簡單的例子。(沒有錯誤檢查)
您應該使用fwrite(),因為您要寫入文件的字符串不是“以null結尾”。 另請注意,使用fopen()指定“b”模式,這意味着您要將文件作為二進制文件打開。
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
#define FILE_BLOCK_SIZE 50
int _tmain(int argc, _TCHAR* argv[])
{
FILE *fin, *fout;
unsigned char *BufContent = NULL;
BufContent = (unsigned char*) malloc(FILE_BLOCK_SIZE);
size_t BufContentSz;
if((fin=fopen("E:\\aa.txt", "rb")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
if((fout=fopen("E:\\bb.txt", "wb")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
while ((BufContentSz = fread(BufContent, sizeof(unsigned char), FILE_BLOCK_SIZE, fin)) > 0)
{
fwrite(BufContent, sizeof(unsigned char), BufContentSz, fout);
}
fclose(fout);
fclose(fin);
delete BufContent;
return 0;
}
首先,更改char buffer[MAX];
到int buffer[MAX];
和char c;
到int c;
,對於char
可以是signed char
或unsigned char
,具體取決於您的實現。 在后一種情況下, c = EOF
會給c
一個大的正數(無論如何都是無符號的),所以循環永遠不會結束。 int
足夠大,可以容納所有字符和EOF。
然后,改變你的
fprintf(fout, "%s", buffer);
至
fwrite(buffer, 1, length, four);
這是因為fprintf(fout, "%s", buffer);
調用C風格的字符串,結尾為'\\0'
,但您的buffer
不是零終止。 結果,程序將繼續復制堆棧中的東西,直到滿足'\\0'
,在file2中留下大量垃圾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.