尝试制作一个简单的程序(在 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()
}
}
这是我尝试做的事情(如果一行的第一个字符是 '\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()
}
}