读取.txt文件并将其保存在数组中。fscanf有问题吗
我想从包含英语句子的.txt文件中读取,并将其存储到字符数组中。每个字都是一个字一个字。我试过了,但有个错误:11。我在fscanf和读取C中的文件时遇到问题读取.txt文件并将其保存在数组中。fscanf有问题吗,c,file-io,segmentation-fault,eof,scanf,C,File Io,Segmentation Fault,Eof,Scanf,我想从包含英语句子的.txt文件中读取,并将其存储到字符数组中。每个字都是一个字一个字。我试过了,但有个错误:11。我在fscanf和读取C中的文件时遇到问题 #include<stdio.h> #include<math.h> #include<limits.h> int main() { FILE* fp = fopen("file1.txt","r"); char c , A[INT_MAX]; int x; while(
#include<stdio.h>
#include<math.h>
#include<limits.h>
int main()
{
FILE* fp = fopen("file1.txt","r");
char c , A[INT_MAX];
int x;
while(1)
{
fscanf("fp,%c",&c);
if(c == EOF)
{break;}
A[x] = c;
x++;
}
int i;
for (i=0;i<x;i++)
printf("%c",A[i]);
return 0;
}
#包括
#包括
#包括
int main()
{
FILE*fp=fopen(“file1.txt”、“r”);
字符c,A[INT_MAX];
int x;
而(1)
{
fscanf(“fp、%c、&c”);
如果(c==EOF)
{break;}
A[x]=c;
x++;
}
int i;
对于(i=0;i问题1:将数组作为A[INT\u MAX]
放在堆栈上是不好的做法;它在堆栈上分配了不合理的空间量(并且会在INT\u MAX
相对于内存大小较大的机器上崩溃)。获取文件大小,然后为其分配malloc
空间
fseek(fp, SEEK_END);
long size = ftell(fp);
rewind(fp);
char *A = malloc((size_t) size); // assumes size_t and long are the same size
if (A == NULL) {
// handle error
}
问题2:fscanf
错误。如果您坚持使用fscanf
(这不是读取整个文件的好方法;请参阅问题4),您应该更改:
fscanf("fp,%c",&c);`
应该是
int count = fscanf(fp, "%c",&c);
if (count <= 0)
break;
问题4:fscanf
是读取整个文件的错误方法。假设您已经计算出文件有多大(请参见问题1),您应该使用fread
读取文件,如下所示:
int bytes_read = fread(A, 1, size, fp);
if (bytes_read < size) {
// something went wrong
}
int bytes\u read=fread(A,1,size,fp);
if(字节\读取<大小){
//出了点问题
}
我最初的回答和一条很好的一般规则:
您需要检查返回值,因为您的c
值永远不能是EOF
,因为EOF
是一个int
值,它不适合char
(您应该始终检查返回值,即使看起来不应该发生错误,但我在上面的代码中没有一贯地这样做。)
发件人:
返回值
成功时,函数返回成功填充的参数列表中的项数。由于匹配失败、读取错误或文件结尾的范围,此计数可以与预期项数匹配,也可以小于(甚至为零)
如果在读取过程中发生读取错误或到达文件末尾,则会设置适当的指示器(feof或ferror)。如果在成功读取任何数据之前发生任何一种情况,则会返回EOF
如果在解释宽字符时发生编码错误,函数会将errno设置为EILSEQ。嗨,您应该清除程序读取数据的位置。即使您像字符串一样读取行,也可以访问所有字符
试试看
#include<stdio.h>
#include<string.h>
#define INT_MAX 100
int main()
{
FILE* fp = fopen("file1.txt","r");
char c , A[INT_MAX];
int i;
int x;
j=0
while(fscanf(fp,"%s",A[j])!=EOF)
{
j++;
}
int i;
int q;
for(q=0;q<j;q++)
{
for (i=0;i<strlen(A[q]);i++)
printf("%c ",A[q][i]);
printf("\n");
}
return 0;
}
#包括
#包括
#定义INT_MAX 100
int main()
{
FILE*fp=fopen(“file1.txt”、“r”);
字符c,A[INT_MAX];
int i;
int x;
j=0
while(fscanf(fp,“%s”,A[j])!=EOF)
{
j++;
}
int i;
int-q;
对于(q=0;qc)可以在fopen
之后插入NULL
检查fp
?另外,最好写入int x=0;
a[int\u MAX]
似乎有点保守。您的本地堆栈有那么大吗?@user3121023我想您答对了,这应该是一个答案。最好确保字符串以零结尾。除了投票最多的注释和我的答案中的建议之外,最好更改设计以获得文件长度,malloc
即much空格和fread
一次库调用中的整个文件。并且始终检查返回值,即使看起来没有任何东西会失败。这在很大程度上不是原始代码的唯一问题,仅更改这一点并不能解决许多其他问题。这是许多问题之一,而不是导致该段的问题这是一个错误,但它可能是不知道如何使用调试器的人最不容易看到的问题。(这也是一个严重的问题,在我发布它的时候还没有提到。)好了,现在我的答案涵盖了所有问题,而不仅仅是我最初回答时在回答中已经提到的问题。
#include<stdio.h>
#include<string.h>
#define INT_MAX 100
int main()
{
FILE* fp = fopen("file1.txt","r");
char c , A[INT_MAX];
int i;
int x;
j=0
while(fscanf(fp,"%s",A[j])!=EOF)
{
j++;
}
int i;
int q;
for(q=0;q<j;q++)
{
for (i=0;i<strlen(A[q]);i++)
printf("%c ",A[q][i]);
printf("\n");
}
return 0;
}