您好我为以下问题编写了此代码: 编写一个C程序,将文本文件读入一个字符数组。您可以假定该文件包含不超过1000个字符。但代码只打印文本的第一个字符。我哪里弄错了?
FILE *wse;
char a[1000];
int i;
wse=fopen("21e.txt","r");
for(i=0;i!=100;i++);
{
fscanf(wse,"%c",&a[i]);
printf("%c",a[i]);
}
答案 0 :(得分:2)
您的代码存在逻辑错误,导致其被破坏 - 非常容易修复。
检查计数器的值时还存在样式问题:
i
而 100
但是如果其他一切都没问题就不会让你的代码失败,那么&#39 ;更常见且符合您的任务规范,以检查小于 100
的值,或者您想要的任何常数。虽然这可能不是完成此类任务的最优雅方式,但它是对您的按字符读取方法代码的修改:
#include <stdio.h>
int main(void)
{
FILE *wse;
char a[1000];
int i;
if((wse=fopen("3.txt","r")) == NULL)//always check for file errors!
return 1;
for( i=0 ; i<100 ; i++ )
{
if(fscanf(wse,"%c",&a[i]) != 1) //check against end of file!
break;
printf("%c",a[i]);
}
fclose(wse);
return 0;
}
答案 1 :(得分:1)
只需使用fgetc
和putchar
,因为您正在阅读逐个字符
int c;
while ((c = fgetc(fp)) != EOF)
putchar(c);
另外,检查fopen
的返回值。它会在失败时返回NULL
。
答案 2 :(得分:1)
请找到更正后的代码:
FILE *wse;
char a[1000];
int i=0;
wse=fopen("21e.txt","r");
while(fscanf(wse,"%c",&a[i]) == 1)
{
printf("%c",a[i]);
i++;
}
首先,我通过在for循环后删除分号来更正代码。其次,用while循环替换为读取直到文件末尾。这是因为如果循环穿过EOF(文件结束),它可能会崩溃。
答案 3 :(得分:1)
退后一分钟,了解您在C中输入的替代方案。您有面向字符的输入函数(getchar()
,fgetc()
等等。)一次读取一个字符的文件。然后你有面向行的输入函数(例如fgets
和getline
),它们将一次读取输入行,最后你有面向块的< / em>输入函数,例如fread
和read
,可用于将整个文件读入单个内存块。 (还有其他一些用于复制和内存访问的工具,例如sendfile
和mmamp
也可以使用,但可能不会在这里使用。scanf
函数系列,虽然它们确实有有用,不打算在多行上读取不同的值。
您的基本方法应该是面向字符的输入或面向行的输入,以将文件读入数组。更容易或两者可能是面向行的输入,您将读取整行,然后将标记化行与strtok
(或通过使用开始和结束指针在读取分隔单词之后向下走每一行。
刺伤你选择的方法并在卡住时回发。我们很乐意提供帮助。
使用fgets
读取strtok
后面的每一行以将每行分成单词的简短示例可能类似于以下内容。 note :程序将从命令行上给出的文件名中读取(如果没有给出名称,则默认来自stdin
)
#include <stdio.h>
#include <string.h>
enum {MAXC = 1000};
int main (int argc, char **argv) {
char buf[MAXC] = "";
char *delims = " \t\n.,:;"; /* word separators for strtok */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* always validate file is open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
while (fgets (buf, MAXC, stdin)) { /* read each line into buf */
char *p = buf;
printf ("\n line: %s\n tokens:\n", buf);
/* tokenize buf into words with strtok */
for (p = strtok (buf, delims); p; p = strtok (NULL, delims))
printf (" %s\n", p);
}
if (fp != stdin) fclose (fp); /* close if not reading stdin */
return 0;
}
示例输入
$ cat dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
示例/输出强>
$ ./bin/strtok_fgets_file <dat/captnjack.txt
line: This is a tale
tokens:
This
is
a
tale
line: Of Captain Jack Sparrow
tokens:
Of
Captain
Jack
Sparrow
line: A Pirate So Brave
tokens:
A
Pirate
So
Brave
line: On the Seven Seas.
tokens:
On
the
Seven
Seas