所以我得到了这个文件,我想scanf()
只有{}
里面的数字而不是第二个{}
里面的数字,依此类推。
我设法只调用文件中的数字,但我不知道如何将它们分成组
这是文件:
{5, 2, 3}, {1,5}, { }, { }, {3}, { }, { }
以下是我目前使用的代码
void main()
{
int rc=0,num,size;
FILE* f = fopen("graph-file.txt","rt");
if (f == NULL)
{
printf("Failed to open the file\n");
}
size = fscanf(f,"%d",&num);
fseek(f,1,SEEK_CUR);
while(rc != EOF)
{
if( rc == 1)
{
printf("%d\n",num);
}
fseek(f,1,SEEK_CUR);
rc = fscanf(f,"%d",&num);
}
}
答案 0 :(得分:0)
阵列可能是您完成此任务所需要的。数组允许您拥有各种数量的数字,您可以存储您阅读的内容。这就是你如何分开分组。接下来的部分将是如何更改您正在查看的数组的哪个部分,这个链接也应该有所帮助。 C Arrays Tutorial.
如果您尝试阅读的数字只是单位数字,那么您可以放弃fseek和fscanf函数并改用getc。只需检查每个读数是否有任何数字'0' - '9'。 C getc
我链接的那些网站也有许多关于学习C \ C ++的其他好的教程。
祝你好运。 编辑:较少居高临下。答案 1 :(得分:0)
您的代码存在一些问题,例如模式字符串错误"rt"
?您只需要为二进制文件指定"b"
,并且只影响行字符的结尾,如果在不同平台上读取/写入文件,则可能会出现问题。
要实现您想要的目标,没有简单的方法,因为@ JonathanLeffler建议in this comment您可以使用 json 库json-c 1 < / sup>是一个非常容易使用的。
如果您想自己动手,请尝试我刚刚编写的代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int
append_number(int size, int **arrays, int value)
{
void *pointer;
pointer = realloc(arrays[0], (++size + 1) * sizeof(**arrays));
if (pointer == NULL)
return 0;
arrays[0] = pointer;
arrays[0][size] = value;
return 1;
}
int
get_value(const char *input)
{
if (input == NULL)
return -1;
while ((*input != '\0') && (isspace((unsigned char) *input) != 0))
input++;
if (*input == '\0')
return -1;
return atoi(input);
}
int *
extract_arrays(char *array)
{
int value;
int *list;
list = malloc(sizeof(*list));
if (list == NULL)
return NULL;
list[0] = 0;
while (array != NULL)
{
char *delimiter;
delimiter = strchr(array, ',');
if (delimiter != NULL)
*delimiter = '\0';
value = get_value(array);
if (value > 0)
list[0] += append_number(list[0], &list, value);
if (delimiter != NULL)
array = delimiter + 1;
else
array = NULL;
}
return list;
}
void
print_array(int *list)
{
fprintf(stdout, "[");
for (int j = 1 ; j < list[0] ; ++j)
fprintf(stdout, "%d ", list[j]);
if (list[0] > 0)
fprintf(stdout, "%d", list[list[0]]);
fprintf(stdout, "]\n");
}
int **
parse_line(char *line, size_t *count)
{
char *open;
char *close;
char *next;
int **arrays; // Depends on the maximum size of an inner array
*count = 0;
arrays = NULL;
next = line;
while ((next != NULL) && ((open = strchr(next, '{')) != NULL))
{
close = strchr(open, '}');
if (close != NULL)
{
void *pointer;
char *values;
*close = '\0';
next = strchr(close + 1, ',');
values = open + 1;
pointer = realloc(arrays, (*count + 1) * sizeof(*arrays));
if (pointer == NULL)
goto error;
arrays = pointer;
arrays[(*count)++] = extract_arrays(values);
}
else
next = open + 1;
}
return arrays;
error:
for (size_t i = 0 ; i < *count ; ++i)
free(arrays[i]);
free(arrays);
*count = 0;
return NULL;
}
int main(void)
{
char line[100];
size_t count;
int **arrays;
FILE *file;
file = fopen("graph-file.txt", "r");
if (file == NULL)
return -1; // Failure openning the file
while (fgets(line, sizeof(line), file) != NULL)
{
arrays = parse_line(line, &count);
for (size_t i = 0 ; i < count ; ++i)
{
print_array(arrays[i]);
// DO something with it ...
free(arrays[i]);
}
free(arrays);
}
fclose(file);
return 0;
}
当然,有很多可能的优化(特别是realloc()
部分),但我留给你。
上面,int **
返回的parse_line()
指针包含count
个数组,其中第一个元素是每个数组的长度。
1 我知道在大多数Linux发行版中,它可以与软件包管理器一起安装,最近我一直在使用它进行一些与web开发相关的项目。