我在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;
}
答案 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);
}
}