尝试制作一个简单的程序(在 C 中),将给定文本文件中的所有非空行复制到新的文本文件中

Trying to make a simple program (in C) that copies all non empty lines from a given text file into a new text file

这是我尝试做的事情(如果一行的第一个字符是 '\n' 它必须是一个空行)但是它给了我错误信息: "Thread 1: EXC_BAD_ACCESS (code=1, address=0x68" 在行fgets..

#include<stdio.h>
#define MAX_LEN 80

int main(int argc, char *argv[])
{
    FILE *fin,*fout;
    fin=fopen("poem_in.txt","r");
    fout=fopen("poem_out.txt","w");
    char line[MAX_LEN];

    do {
        fgets(line, MAX_LEN, fin);
        if ((line[0])!='\n') fputs(line,fout);
    } while(fgets(line, MAX_LEN, fin)!=NULL);

    fclose(fin);
    fclose(fout);
    return 0;
}

我试着查看我的教授给出的更正,但她使用了 strcmp(line,"\n"),所以它不是很有用,我不知道如何比较字符串和字符?任何帮助都将不胜感激,对我的学习会有很大帮助!

您每次在循环中调用 fgets() 两次。结果,您只检查每隔一行是否为空。

改为这样做。

while (fgets(line, MAX_LEN, fin)) {
    if ((line[0])!='\n') fputs(line,fout);
}

如果您在 fgets() 行收到错误,可能是因为文件未成功打开。你应该先检查一下。

    fin=fopen("poem_in.txt","r");
    if (!fin) {
        fprintf(stderr, "Can't open put file poem_in.txt\n");
        exit(1);
    }
    fout=fopen("poem_out.txt","w");
    if (!fout) {
        fprintf(stderr, "Can't open output file poem_out.txt\n");
        exit(1);
    }

I tried looking at the correction my professor gave but she used strcmp(line,"\n") so its not very useful and i don't get how its possible to compare a string and a char?

其实"\n"不是字符而是C字符串。请注意,char 将写为 '\n' 并且这里有 C 字符串 ("\n") ,因此可以比较。此外,您可能想看看 strcmp 文档 http://www.cplusplus.com/reference/cstring/strcmp/

但是请记住,只要未找到 NULL 字符,strcmp 就会从参数中读取字符串,这意味着格式错误的输入会使其读取的内容超出预期,从而导致崩溃。为了防止有一个更智能的 strcmp 等效项,称为 strncpy,它带有一个附加参数 - 输入的最大长度。你用 MAX_LEN ans 定义了这个,所以如果你决定听从教授的建议,最好使用 strncmp http://www.cplusplus.com/reference/cstring/strncmp/

This is what I tried doing (if the first charcacter of a line is '\n' it must necessarily be an empty line) but it gives me the error message: "Thread 1: EXC_BAD_ACCESS (code=1, address=0x68" at the line of fgets..

现在,通读您的代码,有一些地方需要您注意。例如,您在 do-while 循环中调用 fgets 两次:

do {
    fgets(line, MAX_LEN, fin);
    if ((line[0])!='\n') fputs(line,fout);
} while(fgets(line, MAX_LEN, fin)!=NULL);

您从文件中读取一行,并可能将其写入另一个文件。然后(同时)你又读了一行,但这次你根本不看它,而是再读一遍。实际上,您每隔 2 行就跳过一次。

我认为您应该做的是从 while 循环开始而不是 do-while 并在 while 子句中执行 fgets。然后使用 strncmp 将输出与 new-line 字符进行比较,并按照您现在的方式保存到文件中。类似于:

while(fgets(...)) {
   if strncmp {
     fputs()
   }
}