读取.txt文件并将其保存在数组中。fscanf有问题吗

读取.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(

我想从包含英语句子的.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(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;
}