【问题标题】:How to put text from file into array如何将文件中的文本放入数组
【发布时间】:2014-12-30 17:11:28
【问题描述】:

我需要从文件中读取文本(几句话的文本),然后写下所有唯一字符。为此,我需要使用一个数组。我写了这段代码,但它什么也没给我。

#include <stdio.h>

int main(void) {
  int i;
  FILE *in = fopen("test.txt", "r");

  if (in) {
    char mas[50];
    size_t n = 0;
    int ch;
    while ((ch = getc(in)) != EOF) {
      mas[n++] = (char)ch;
    }
    fclose(in);
  }

  for (i = 0; i < 50; i++) {
    printf("%c", mas[i]);
    printf("\n");
  }
  return 0;
}

【问题讨论】:

  • 它实际上应该生成一个编译错误,表明masprintf("%c",mas[i]) 语句中未定义,因为char mas[50] 仅在您的if 语句块中定义。
  • 这一项已修复。现在它给出了一些输出,但它是不可理解的,它只包含数字,而不是文本中的字符。
  • 这是因为您正在打印 mas 的所有 50 个元素,但您可能没有从文件中读取 50 个字符。剩余的mas 条目只是随机内存内容。你必须记录你读了多少个字符,然后只打印出来。例如,如果您将size_t n 声明放在if 块之外,那么您可以使用n 作为计数,并使用for (i = 0; i &lt; n; i++)... 打印每个读取的字符。

标签: c arrays file-io unique


【解决方案1】:
//low level input output commands method

#include <fcntl.h>

int main()
{
    int x,i,n,v=1;
    char s[256],str;

    for (i=1;i<=255;i++)
        s[i]='0';
    x=open("out.txt",O_RDONLY);

    if (x==-1)
    {
        printf("Invalid file path");
        return 0;
    }

    while (n!=0)
    {
        n=read(x,&str,1);
        s[(int)str]='1';
        v=0;
    }
    close(x);

    for (i=1;i<=255;i++)
        if (s[i]=='1')
            printf("%c",(char)i);

    if (v)
        printf("Blank file!");
    close(x);

    return 0;
}

【讨论】:

  • 为什么str[1]???为什么不直接使用char str;read(x, &amp;str, 1) 并且应该为变量使用有意义的名称。还要格式化你的代码,使其可读,相信我,你永远不会后悔这样做。
  • 另外,您应该检查open() 的返回值,它在错误时返回-1,例如如果文件不存在,在这种情况下,您将尝试从无效文件中读取描述符。
  • @iharob 谢谢你的提示。
【解决方案2】:

scope 有问题。 mas 在您的 if 代码块中声明,并且在 if 块之外没有可见性。将mas 的声明移到块外。您还需要将n 保留在外面,即:

int i;
char mas[50];
size_t n = 0;

接下来,您无法将读取限制为less than 50 chars,并且很容易溢出mas。添加对n的检查:

 while ((ch = getc(in)) != EOF && n < 50) {

最后将你的字符写入限制为读取的数字n

for(i=0;i<n;i++)

这将编译并运行。如果您在启用 warnings 的情况下进行编译,编译器会为您识别出scope 问题。始终至少使用-Wall -Wextra 进行编译。

【讨论】:

  • 编译器不会在没有警告的情况下编译该代码,因为mas 没有在if 之外定义。
  • 这就是 如果您在编译时启用了警告,编译器会为您识别范围问题。 说。其中哪一部分不清楚?
  • 您不需要为此启用警告。
  • 告诉新用户使用警告有什么问题吗?警告添加了变量'mas'设置但未使用的线索
  • 不,没有错。我从不编译没有-Wall -Werrorgcc。只是问题不会产生警告而是错误,在 if 内部它将被设置但从未使用过,但在 if 它甚至没有声明之外,所以如果没有启用警告,代码将无法编译并且编译器会抛出以下错误error: 'mas' undeclared (first use in this function).
【解决方案3】:

如果您打算将一些字符读取到您的数组中并打印出唯一的,请检查以下代码

#include <stdio.h>

int main(void)
{
    int i,j,flag;
    char mas[50];
    size_t n = 0;
    FILE *in = fopen("test.txt", "r");
    if (in) {    

        int ch;
        while ((ch = getc(in)) != EOF && n < 50)  {
            mas[n++] = (char)ch;
        }
        fclose(in);
        }
    for(i=0;i<n;i++)     
    {
      flag = 0;
      for(j=i+1;j<n;j++)
      {
         if( mas[i] == mas[j])
         {
         flag = 1;
         break;
         }
      }
       if(!flag)
       {
         printf("%c\n",mas[i]);
        }
    }
      return 0;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多