如何读取文本文档的特定行并将其写入另一个文本| C

时间:2016-12-01 14:09:03

标签: c getline

我创建了一个函数,它将源文件的名称,目标文件的名称以及将复制到目标文件的源文件行的起始行和结束行作为参数,如下例所示。我想要做的就是输入我想要复制到其他文本文件的行,如下例所示:

我给你看的代码"读取"一个文本文件的内容和"写"另一个。我想"写"用户提供的特定行,而不是整个文本文件

  

用户输入
  Source_file.txt //目标文件将从中读取的文件
    destination_file.txt //程序编写的新文件
   2 3 //它将打印到目标文件的行:2 -3

Source_file.txt

1
2
3
4
5
6

destination_file.txt

2
3

#include <stdio.h>
#include <stdlib.h>

void cp(char source_file[], char destination_file[], int lines_copy) {
    char ch;
    FILE *source, *destination;

    source = fopen(source_file, "r");
    if (source == NULL) {
        printf("File name not found, make sure the source file exists and is ending at .txt\n");
        exit(EXIT_FAILURE);
    }

    destination = fopen(destination_file, "w");
    if (destination == NULL) {
        fclose(source);
        printf("Press any key to exit...\n");
        exit(EXIT_FAILURE);
    }

    while ((ch = fgetc(source)) != EOF)
        fputc(ch, destination);

    printf("Copied lines %d  from %s to %s \n",
           lines_copy, source_file, destination_file, ".txt");

    fclose(source);
    fclose(destination);
}

int main() {
    char s[20];
    char d[20];
    int lines;

    printf("-Enter the name of the source file ending in .txt\n"
           "-Enter the name of the destination file ending in .txt\n"
           "-Enter the number of lines you want to copy\n\n");

    printf(">subcopy.o ");
    gets(s);
    printf("destination file-> ");
    gets(d);
    printf("Lines: ");
    scanf("%d", &lines);

    cp(s, d, lines);

    return 0;
}

3 个答案:

答案 0 :(得分:2)

在cp()中,为了选择要保留的行,您必须知道它们在输入文件中的位置。因此,您需要计算行数。

使用fgets而不是fgetc将允许您计算行数。

另一方面,如果我想在文件中选择 3和7到12 行,我会使用:

sed -n -e "3p;7,12p" < input.txt > output.txt

答案 1 :(得分:1)

这是一个非常简单的解决方案,让我们知道,为简单起见,一行的最大长度将为100个字符(如果一行超过100个字符,则只会占用前100个)

在顶部(主要外部)你可以写

#ifndef MAX_LINE_SIZE
#define MAX_LINE_SIZE 100
#endif

我知道很多人不喜欢这样但我认为在这种情况下,如果你需要修改最大线路大小,它会使代码更优雅,更容易更改。

只打印想要的行,你可以做这样的事情

char line[MAX_LINE_SIZE];

int count = 0;

while (fgets(line, MAX_LINE_SIZE, source)){
    count++;
    if (3 <= count && count <= 5){
        fputs(line, destination);
    }
}

当重新调整EOF时,while循环将结束,因为fgets返回NULL。

P.S。可能会有一些轻微的错误,因为我写得非常快,并且通过内存,但一般来说它应该工作。

答案 2 :(得分:0)

您的计划存在一些问题:

  • 不要使用gets(),否则可能导致缓冲区溢出。

  • 始终使用类型int存储fgetc()的返回值,以便将EOF与常规字节值区分开来。

  • 您将额外参数".txt"传递给printf()。它会被忽略但是应该被删除。

要从源到目标复制一系列行,您只需以这种方式修改函数:

#include <stdio.h>
#include <string.h>
#include <errno.h>

void cp(char source_file[], char destination_file[], int start_line, int end_line) {
    int ch;
    int line = 1, lines_copied;
    FILE *source, *destination;

    source = fopen(source_file, "r");
    if (source == NULL) {
        printf("Cannot open input file %s: %s\n",
               source_file, strerror(errno));
        exit(EXIT_FAILURE);
    }

    destination = fopen(destination_file, "w");
    if (destination == NULL) {
        printf("Cannot open output file %s: %s\n",
               destination_file, strerror(errno));
        fclose(source);
        exit(EXIT_FAILURE);
    }

    while ((ch = fgetc(source)) != EOF) {
        if (line >= start_line && line <= end_line) {
            fputc(ch, destination);
        }
        if (ch == '\n') {
            line++;
        }
    }
    lines_copied = 0;
    if (line > start_line) {
        if (line >= end_line) {
            lines_copied = end_line - start_line + 1;
        } else {
            lines_copied = line - start_line + 1;
        }
    }
    printf("Copied lines %d from %s to %s\n",
           lines_copy, source_file, destination_file);

    fclose(source);
    fclose(destination);
}

int main() {
    char source_file[80];
    char destination_file[80];
    int start_line, end_line;

    printf("-Enter the name of the source file ending in .txt\n"
           "-Enter the name of the destination file ending in .txt\n"
           "-Enter the start and end line\n\n");

    printf(">subcopy.o ");
    if (scanf("%79s", source_file) != 1) {
        return 1;
    }
    printf("destination file-> ");
    if (scanf("%79s", destination_file) != 1) {
        return 1;
    }
    printf("Start and end lines: ");
    if (scanf("%d %d", &start_line, &end_line) != 2) {
        return 1;
    }

    cp(source_file, destination_file, start_line, end_line);

    return 0;
}