我想复制一个巨大的txt文件并“收缩”它。这是我的代码,但似乎仍然需要花费大量时间来阅读文件。有没有办法从特定的行号读取到EOF?例如,前100万行对我没用,如何从100万行读取。或者无论如何阅读EOF?
include<stdio.h>
include<stdlib.h>
void main() {
FILE *fp1, *fp2;
char ch;
int i = 1;
int n = 0;
int k;
fp1 = fopen("co.data", "r"); /* open a file to read*/
fp2 = fopen("Output.txt", "w"); /* open a file to write*/
printf("please enter how many lines do not need to be copied\n");
scanf ("%d", &k);
while (1) {
ch = fgetc(fp1); /* a loop to read/copy the file*/
if (ch == '\n') /* record the number of lines*/
i++;
if (ch == EOF)
break;
else if (i>k)
putc(ch, fp2);
}
printf("File copied Successfully!\n");
printf("number of lines read is %d\n",i-1);
printf("number of lines copied is %d\n",i-1-k);
fclose(fp1);
fclose(fp2);
}
答案 0 :(得分:2)
您的问题有两个可能的答案,具体取决于您的文件是否已知行长。
有没有办法从特定的行号读取到EOF
在行长度完全是任意的(变量)的文件中,没有。
例如,如果第1行是10个字符,第2行是20个字符,那么无法计算第3行的开始位置而不迭代第1行和第2行。
操作系统并不神奇;如果支持这种功能,他们也必须首先遍历文件。无论哪种方式,你都将循环遍历内容。
现在,如果行长度保证相同,那就是另一回事了。
假设您有一个类似的文本文件:
AAAAAAA
BBBBBBB
CCCCCCC
上述文本文件中的每一行都是7个字符。假设您的行终止符为\n
,则每行占用恰好8个字节。
在这种情况下,您可以安全地fread()
一次8个字节,并且知道您正在获得一行。要跳转到文件中的特定字节,您可以使用fseek()
。
由于您知道此场景中线条的长度,因此只需执行
即可跳至第N
行。
fseek(fp1, S * N, SEEK_SET);
其中N
是行号(从0开始),S
是行的长度(如上所述,我们的示例文件中有8个字节)。
请注意,如果您使用的是Unicode等多字节编码,则第二个解决方案将会中断。记住这一点。
答案 1 :(得分:-1)
使用 fgets()制作程序,试试吧。
\r