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

时间:2017-11-21 17:31:00

标签: 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;
}

1 个答案:

答案 0 :(得分: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);
    }
}