【问题标题】:How to read substrings with varying length如何读取不同长度的子字符串
【发布时间】:2015-11-28 07:47:16
【问题描述】:

我有一个文件,它包含三列(传感器的读数),长度不一,例如。

-728 -233 3947
4258 -623 333 
-500 93 -4141 
-491 107 -4136 
-495 94 -4161 
-886 101 -4148 
-2555 1864 -4888 

我使用fgets 读取该行。但我想将第一列读为 x,第二列读为 y,第三列读为 z。即使我使用空格作为检测新子字符串的标记,这也不能解决我的问题,因为每一行都有不同的列数字长度。关于如何做的任何想法?我正在粘贴从文件中读取行并尝试将三个子字符串打印为三个数组元素的代码的 sn-p。

char *arr_x, *arr_y, *arr_z;

fp = fopen(filename, mode);
    while(! feof(fp))
    {
        if( fgets (str, 60, fp)!=NULL ) 
            {
                 strncpy(arr_x, str, ' ');
                 strncpy(arr_y, str, ' ');
                 puts(str);

            }
    }

【问题讨论】:

  • str 声明在哪里?
  • str 被声明为 char str[60];我只是想只粘贴从文件中读取的逻辑。谢谢 Sourav Ghosh!
  • 建议:int x, y, z; ... while(fgets (str, 60, fp)!=NULL){ sscanf(str, "%d %d %d", &x, &y, &z); }

标签: c parsing file-io fgets


【解决方案1】:

我相信你在正确的道路上,只需要添加更多的调整。请看下面的算法。

  1. 定义三个数组,分别对应xyz
  2. 阅读整行。
  3. 如您所想,使用strtok() 以空格作为分隔符开始对行进行标记
  4. 将第一个标记存储在x 数组的第i 个索引中,第二个标记存储在y 数组中,第三个标记存储在z 数组中。
  5. 继续下一行,增加i 并继续存储它们直到fgets() 返回NULL。

还有,FWIW,

【讨论】:

  • 我引用了链接tutorialspoint.com/c_standard_library/c_function_strtok.htm,但它显示“-”作为分隔符,但我想要空格作为分隔符。
  • @ShankdeepMukerji 你可以使用任何你喜欢的分隔符。顺便说一句,您是否检查了我在答案中链接的手册页?
  • 是的,我做到了。感谢分享使用 while ( !feof (file) ) 的效果。那么对于使用 delim 作为空格,我应该使用“”吗?
  • @ShankdeepMukerji 对。
  • if( fgets (str, 60, fp)!=NULL ) { token = strtok(str, s); while(token != NULL) { strcpy(ch_x, strtok(NULL, s)); printf("%s", ch_x); strcpy(ch_y, strtok(NULL, s)); printf("%s", ch_y); strcpy(ch_z, strtok(NULL, s)); printf("%s", ch_z); } p++;这会抛出错误 hello.c:171:10: error: incompatible types when assignment to type 'char[7]' from type ‘char *’ ch_z = strtok(NULL, s);
【解决方案2】:

试试:

while(in != '\n') /* while (!fread(&in, 1, 1, p) */
{
     n++;
     arr = (char *) calloc (n, sizeof(char));
     scanf ("%c", &in);
}

抱歉,我的单元格无法缩进。

【讨论】:

    【解决方案3】:

    也许使用fscanf 会更简单?

    我相信这是受信任的数据,因此缓冲区溢出没有问题,但如果不是使用 fgets 读取数据(这样您就可以限制读取的数据量),然后在字符串上使用 sscanf .

    这是我的代码:

    #include <stdio.h>
    
    int main() {
        FILE *fp = fopen("read_file_space_delimited.txt", "r");
    
        if (fp) {        
            int x, y, z;
    
            while (fscanf(fp, "%d %d %d", &x, &y, &z) != EOF) {
                printf("Numbers: %d %d %d\n", x, y, z);
            }
    
            fclose(fp);
        }
    }
    

    文件 read_file_space_delimited.txt 包含您在问题中提供的数据。编译并运行此程序后,这是我得到的输出:

    Numbers: -728 -233 3947
    Numbers: 4258 -623 333
    Numbers: -500 93 -4141
    Numbers: -491 107 -4136
    Numbers: -495 94 -4161
    Numbers: -886 101 -4148
    Numbers: -2555 1864 -4888
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2016-04-19
      相关资源
      最近更新 更多