我有一道 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/