如何读取不同长度的子串
How to read substrings with varying length
我有一个文件,其中包含三列(来自传感器的读数),长度各不相同,例如。
-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。即使我使用空白 space 作为检测新子字符串的标记,也不能解决我的问题,因为每行的列数字长度不同。关于如何做的任何想法?我正在粘贴一段代码,它从文件中读取行并尝试将三个子字符串打印为三个数组元素。
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);
}
}
我相信您走在正确的道路上,只需要添加更多的调整。请看下面的算法。
- 定义三个数组,分别对应
x
、y
和z
.
- 阅读整行。
- 开始使用
strtok()
和 space 作为分隔符对行进行标记,如您所想
- 将第一个标记存储在
x
数组的第 i
个索引中,将第二个标记存储在 y
数组中,将第三个标记存储在 z
数组中。
- 继续下一行,增加
i
并继续存储它们直到fgets()
returns NULL。
此外,FWIW,
- 在使用 returned 文件指针之前,始终检查
fopen()
的 return 值是否成功。
- 见Why is “while ( !feof (file) )” always wrong?
尝试:
while(in != '\n') /* while (!fread(&in, 1, 1, p) */
{
n++;
arr = (char *) calloc (n, sizeof(char));
scanf ("%c", &in);
}
抱歉无法在我的单元格上缩进。
也许使用 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
我有一个文件,其中包含三列(来自传感器的读数),长度各不相同,例如。
-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。即使我使用空白 space 作为检测新子字符串的标记,也不能解决我的问题,因为每行的列数字长度不同。关于如何做的任何想法?我正在粘贴一段代码,它从文件中读取行并尝试将三个子字符串打印为三个数组元素。
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);
}
}
我相信您走在正确的道路上,只需要添加更多的调整。请看下面的算法。
- 定义三个数组,分别对应
x
、y
和z
. - 阅读整行。
- 开始使用
strtok()
和 space 作为分隔符对行进行标记,如您所想 - 将第一个标记存储在
x
数组的第i
个索引中,将第二个标记存储在y
数组中,将第三个标记存储在z
数组中。 - 继续下一行,增加
i
并继续存储它们直到fgets()
returns NULL。
此外,FWIW,
- 在使用 returned 文件指针之前,始终检查
fopen()
的 return 值是否成功。 - 见Why is “while ( !feof (file) )” always wrong?
尝试:
while(in != '\n') /* while (!fread(&in, 1, 1, p) */
{
n++;
arr = (char *) calloc (n, sizeof(char));
scanf ("%c", &in);
}
抱歉无法在我的单元格上缩进。
也许使用 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