在 C 中仅将文件的一部分复制到新文件

标签 c file loops pointers file-io

我有一道 C 语言练习题,要求我创建一个仅将文件的一部分复制到另一个文件的函数。限制是大于 maxlen 个字符的行不会复制到新文件中,并且换行符不计算在内,因此不应复制。我的函数的一部分表示,如果文件不存在,则应该明确说明这一点,并且当我运行该代码时,我会收到这些错误消息;但是,我可以看到创建的文件位于我的文件夹内。每当我打开运行代码后尝试读取的文件时,我都会得到以下信息:

./Debug/main.c.o ./Debug/dot.c.o ./Debug/dataBase.c.o ./Debug/intPrompt.c.o ./Debug/numWords.c.o ./Debug/LinkedList.c.o   

下面是我的代码:

void shortLines(char* f1, char* f2, int maxlen) {
    FILE* fp = fopen(f1, "r");
    FILE* fp2 = fopen(f2, "w");
    if (fp == NULL) {
        perror("File does not exist");
    }
    if (fp2 == NULL) {
        perror("File does not exist");
    }
    char singleLine[maxlen];
    char check;
    size_t len;
    do {
        fgets(singleLine, maxlen, fp);
        len = strlen(singleLine);
        if (singleLine[len-1] == '\n') {
            singleLine[len-1] = '\0';
        }
        fprintf(fp2, "%s", singleLine);
    } while ((check=getc(fp) != EOF));
}

int main(int argc, char **argv) {
    shortLines("Andrew.txt", "Andrew2.txt", 25);
    return 0;
}

最佳答案

我刚刚创建了名为 Andrew.txt 和 Andrew2.txt 的新文件,这些文件似乎由于某种奇怪的原因而工作。无论如何,代码中存在一些问题。首先,在调用 fgets 后,我需要确保清除该行中的剩余字符。我使用 while 循环和 fgetc 来完成此操作。如果到达 EOF,则继续,然后 fgets 也会返回 EOF,从而破坏外循环。

void shortLines(char* f1, char* f2, int maxlen) {
    FILE* fp = fopen(f1, "r");
    FILE* fp2 = fopen(f2, "w");
    if (fp == NULL) {
        perror(f1);
    }
    if (fp2 == NULL) {
        perror(f2);
    }
    char line[maxlen+1];
    size_t len;
    char c;
    while (fgets(line, maxlen+1, fp) != NULL) {
        len = strlen(line);
        if (len == maxlen) {
            while ((c=fgetc(fp)) != '\n') {
                if (feof(fp)) {
                    break;
                }
            }
            continue;
        }
        if (line[len-1] == '\n') {
            line[len-1] = '\0';
        }
        fprintf(fp2, "%s\n", line);
    }
}

关于在 C 中仅将文件的一部分复制到新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419180/

相关文章:

c - 如何使用 Kerberos 票证中的 PAC 信息

c - C 中的 mmap 用于文本文件

java - 更新文本文件中的 double

performance - 如何有效地在文件中插入 byte slice ?

c - 将字符串设置为一个值并稍后使用它

PHP 循环巨大的文本文件非常慢,你能改进吗?

c - 多级数据结构(链表)

c - 如何在 C 中通过 HTTP 写入图像?

c++ - 在文本文件中移动 C++

c++ - 如何在基于范围的 for 中使用多个容器?