我正在尝试从文件中逐个字符地准备并将其存储在变量中。 我只需要文件的第一行,所以我使用'\ n'或EOF来停止读取字符,我也需要存储空格。听到的是我的程序,但我在编译时会收到警告,比如指针和整数之间的比较..当我运行时,我得到分段错误
#include<stdio.h>
#include<string.h>
void main()
{
FILE *fp;
char ch;
char txt[30];
int len;
fp=fopen("~/hello.txt","r");
ch=fgetc(fp);
while(ch != EOF || ch!="\n")
{
txt[len]=ch;
len++;
ch=fgetc(fp);
}
puts(txt);
}
答案 0 :(得分:3)
你正在比较错误的事情。尝试:
ch != '\n'
^ ^
此外,正如其他答案所示,您使用len
而未初始化。
最后,您确实认识到fgets
也可以做到这一点。你可以把这个东西改写成:
if (fgets(txt, sizeof txt, fp))
...
答案 1 :(得分:2)
1)len
未启动
int len=0;
2)来自fgetc()页面:
int fgetc ( FILE * stream );
因此fgetc()
返回int
而不是char
,因此您必须将ch
定义为int
int ch;
3)除了 cnicutar 备注外,还应使用while
检查&&
条件,而不是||
}:
while(ch != EOF && ch!='\n')
4)完成从文件中读取后,必须在txt
缓冲区的末尾添加空终止符charachter。
在while
循环
txt[len]='\0';
BTW 您可以使用fscanf()
阅读第一行,这样更容易。只需使用以下代码
fscanf(fp, "%29[^\n]", txt);
"%[^\n]"
表示fscanf
将读取fp
除'\n'
字符之外的所有字符,如果它获得此字符,它将停止阅读。因此,fscanf
将读取fp
中的所有字符,直到找到'\n'
字符并将其保存到缓冲区txt
中,并在末尾使用null终结符charchter。
"%29[^\n]"
表示fscanf
会读取fp
中的所有字符,直到找到'\n'
个字符,或者直到达到29个已读取的字符并将其保存到缓冲区{{} 1}}在末尾使用null终结符charchter。
答案 2 :(得分:1)
len
未初始化,因此您可能尝试在txt
结束之后编写方式。修复很简单 - 在声明
0
int len = 0;
除了cnicutar指出的错误之外,您还应该在使用fopen
之前检查fp
的返回值。
答案 3 :(得分:0)
#include<stdio.h>
#include<string.h>
void main()
{
FILE *fp;
char ch;
char txt[30];
int len = 0;
fp=fopen("~/hello.txt","r");
if(!fp) {
printf("Cannot open file!\n");
return;
}
ch=fgetc(fp);
while(ch != EOF && ch!= '\n' && len < 30)
{
txt[len] = ch;
len++;
ch=fgetc(fp);
}
txt[len] = 0;
puts(txt);
}
答案 4 :(得分:0)
此程序可以帮助您解决问题。
#include<stdio.h>
int main()
{
FILE *fp;
int ch;
char txt[300];
int len=0;
fp=fopen("tenlines.txt","r");
do{
ch=fgetc(fp);
txt[len]=ch;
len++;
} while(ch!=EOF && ch!='\n');
fclose(fp);
puts(txt);
return 0;
}