阅读文本文件

时间:2016-05-08 21:35:24

标签: c

您好我为以下问题编写了此代码: 编写一个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]);
    }

4 个答案:

答案 0 :(得分:2)

您的代码存在逻辑错误,导致其被破坏 - 非常容易修复。

  • 你的for循环有空身 - 这就是它只打印第一个字符的原因。 分号已删除。

检查计数器的值时还存在样式问题:

  • 虽然检查 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)

只需使用fgetcputchar,因为您正在阅读逐个字符

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()等等。)一次读取一个字符的文件。然后你有面向行的输入函数(例如fgetsgetline),它们将一次读取输入行,最后你有面向块的< / em>输入函数,例如freadread,可用于将整个文件读入单个内存块。 (还有其他一些用于复制和内存访问的工具,例如sendfilemmamp也可以使用,但可能不会在这里使用。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