如何从特定的行号复制和写入文件

时间:2016-02-04 10:09:44

标签: c

我想复制一个巨大的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);
} 

2 个答案:

答案 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