在空格后阅读线条

问题描述 投票:0回答:1

我一直试图读取文件的行。我只想要一个空间之后的东西。这是我的代码:

void readFile()
{
  char line[256];                                       /* linia */
  int line_num = 0;                                 /* numero de linia */
  char resultat[4][256];    /* nom i valor del parametre els iguals els ignorem*/
  int i=0;
  int j=0;
  int x=0;
  FILE * f;
  f = fopen(file_to_read, "r");
  if (f==NULL) { fputs ("File error",stderr); exit (1); }
  while(fgets(line, 256, f) != NULL) {
    for (i=0;i<256;i++)
    {
        if (line[i]==' ')
        {
            j=0;
            for (x=i+1; x<256 && line[x] != '\n';x++)
            {
                resultat[line_num][j]=line[x];
                j++;
            }
          resultat[line_num][j] = '\0';
            line_num++;
        }
    }
}

fclose(f);

然后我将数据保存在结构中并打印出来。

代码大部分时间都有效,但有时我会得到分段错误错误。我正在尝试用这个文字。

名称SW-01

MAC 89F107457A36

服务器localhost

服务器端口2019

可能是什么问题?

c file-read
1个回答
0
投票

在嵌套循环中,您已获取空格后的所有字符,直到到达\ n。但是当进程结束时你回到第一个循环并且i的值没有被改变,它再次从空格后面的下一个字符继续,并且可能在该行中存在另一个空格,所以你将重复几行线上每个空间的时间!

因此,由于char resultat[4][256],您可能会达到极限并超出阵列的边界。

您可以在完成i=x行后更新i值:

for (i=0;i<256;i++)
{
    if (line[i]==' ')
    {
        j=0;
        for (x=i+1; x<256 && line[x] != '\n';x++)
        {
            resultat[line_num][j]=line[x];
            j++;
        }
        resultat[line_num][j] = '\0';
        line_num++;
        i=x;
    }
}

顺便说一下,实际上我根本不喜欢你的代码!我的建议只是修补你的代码的补丁,但肯定有更好的方法来编写你想要做的代码。

© www.soinside.com 2019 - 2024. All rights reserved.