将文本文件列中的数据存储到数组中。在 C
Store data from columns of a text file to an array. in C
我有一个如下所示的文本文件:
Process Priority Burst Arrival
1 8 15 0
2 3 20 0
3 4 20 20
4 4 20 25
5 5 5 45
6 5 15 55
7 9 10 70
8 6 15 100
9 5 15 105
10 5 15 115
各列由制表符分隔。
我需要忽略第一行,然后一列中的所有条目将它们存储到一个数组中,例如“int process[10]”。
我找到了这个帖子:Reading in a specific column of data from a text file in C,但是完成的方式非常特定于操作问题中数据的设置方式。
谢谢。
首先要注意这一点,这不是一个完整的解决方案,但我认为它会帮助您解析文件。也代替
store them into an array such as "int process[10]"
我认为最好将它们存储在动态数组中,否则您需要事先知道您正在尝试的列的行数提取。这段代码只解析给定格式的文件并打印第一列的值,我认为在你实现动态数组后可以适应你的情况所以这里是:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*scan_file: read each of the lines of the file.*/
int scan_file(char *filename)
{
char *line_buf = NULL;
size_t line_buf_size = 0;
ssize_t line_size;
char *next = NULL;
FILE *fp = fopen(filename, "r");
if (!fp) {
fprintf(stderr, "Error opening file '%s'\n", filename);
return 1;
}
/*Get the first line of the file and do nothing with it*/
line_size = getline(&line_buf, &line_buf_size, fp);
while (line_size > 0)
{
//second and subsecuent lines
line_size = getline(&line_buf, &line_buf_size,fp);
if (line_size <= 0)
break;
line_buf[line_size-1] = '[=10=]'; /*removing '\n' */
char *part = strtok_r(line_buf, " ", &next);
if (part)
printf("NUMBER: %s\n", part);
}
// don't forget to free the line_buf used by getline
free(line_buf);
line_buf = NULL;
fclose(fp);
return 0;
}
int main(void)
{
scan_file("file.txt");
return 0;
}
注意: 这里我假设文件名为 file.txt
您应该将其更改为您的文件名。
输出:
NUMBER: 1
NUMBER: 2
NUMBER: 3
NUMBER: 4
NUMBER: 5
NUMBER: 6
NUMBER: 7
NUMBER: 8
NUMBER: 9
NUMBER: 10
我这样写是为了让您可以识别行 printf("NUMBER: %s\n", part);
,在这里您可以将其更改为将此值推入动态数组的内容。
试一试。这会从文件中获取所有列,并且符合 ansi:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void parseLine(char *line, int *num1, int *num2, int *num3, int *num4 ){
char* temp;
temp = strchr(line,'\t');
temp[0] = '[=10=]';
*num1 = atoi(line);
line = temp + 1;
temp = strchr(line, '\t');
temp[0] = '[=10=]';
*num2 = atoi(line);
line = temp + 1;
temp = strchr(line, '\t');
temp[0] = '[=10=]';
*num3 = atoi(line);
line = temp + 1;
*num4 = atoi(line);
}
int main(void)
{
FILE* fp;
char line[100];
int process[10];
int priority[10];
int burst[10];
int arrival[10];
int i;
int j;
i = 0;
if ((fp = fopen("./yourfile.txt", "r")) == NULL)
{
printf("Error Opening File\n");
exit(1);
}
fgets(line, sizeof(line), fp);
while (fgets(line, sizeof(line), fp))
{
parseLine(line, &process[i],&priority[i],&burst[i],&arrival[i]);
i++;
}
for (j = 0; j < 10; j++){
printf("Process: %d, Priority: %d, Burst: %d, Arrival: %d\n", process[j], priority[j], burst[j], arrival[j]);
}
fclose(fp);
return 0;
}
我有一个如下所示的文本文件:
Process Priority Burst Arrival
1 8 15 0
2 3 20 0
3 4 20 20
4 4 20 25
5 5 5 45
6 5 15 55
7 9 10 70
8 6 15 100
9 5 15 105
10 5 15 115
各列由制表符分隔。 我需要忽略第一行,然后一列中的所有条目将它们存储到一个数组中,例如“int process[10]”。
我找到了这个帖子:Reading in a specific column of data from a text file in C,但是完成的方式非常特定于操作问题中数据的设置方式。
谢谢。
首先要注意这一点,这不是一个完整的解决方案,但我认为它会帮助您解析文件。也代替
store them into an array such as "int process[10]"
我认为最好将它们存储在动态数组中,否则您需要事先知道您正在尝试的列的行数提取。这段代码只解析给定格式的文件并打印第一列的值,我认为在你实现动态数组后可以适应你的情况所以这里是:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*scan_file: read each of the lines of the file.*/
int scan_file(char *filename)
{
char *line_buf = NULL;
size_t line_buf_size = 0;
ssize_t line_size;
char *next = NULL;
FILE *fp = fopen(filename, "r");
if (!fp) {
fprintf(stderr, "Error opening file '%s'\n", filename);
return 1;
}
/*Get the first line of the file and do nothing with it*/
line_size = getline(&line_buf, &line_buf_size, fp);
while (line_size > 0)
{
//second and subsecuent lines
line_size = getline(&line_buf, &line_buf_size,fp);
if (line_size <= 0)
break;
line_buf[line_size-1] = '[=10=]'; /*removing '\n' */
char *part = strtok_r(line_buf, " ", &next);
if (part)
printf("NUMBER: %s\n", part);
}
// don't forget to free the line_buf used by getline
free(line_buf);
line_buf = NULL;
fclose(fp);
return 0;
}
int main(void)
{
scan_file("file.txt");
return 0;
}
注意: 这里我假设文件名为 file.txt
您应该将其更改为您的文件名。
输出:
NUMBER: 1
NUMBER: 2
NUMBER: 3
NUMBER: 4
NUMBER: 5
NUMBER: 6
NUMBER: 7
NUMBER: 8
NUMBER: 9
NUMBER: 10
我这样写是为了让您可以识别行 printf("NUMBER: %s\n", part);
,在这里您可以将其更改为将此值推入动态数组的内容。
试一试。这会从文件中获取所有列,并且符合 ansi:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void parseLine(char *line, int *num1, int *num2, int *num3, int *num4 ){
char* temp;
temp = strchr(line,'\t');
temp[0] = '[=10=]';
*num1 = atoi(line);
line = temp + 1;
temp = strchr(line, '\t');
temp[0] = '[=10=]';
*num2 = atoi(line);
line = temp + 1;
temp = strchr(line, '\t');
temp[0] = '[=10=]';
*num3 = atoi(line);
line = temp + 1;
*num4 = atoi(line);
}
int main(void)
{
FILE* fp;
char line[100];
int process[10];
int priority[10];
int burst[10];
int arrival[10];
int i;
int j;
i = 0;
if ((fp = fopen("./yourfile.txt", "r")) == NULL)
{
printf("Error Opening File\n");
exit(1);
}
fgets(line, sizeof(line), fp);
while (fgets(line, sizeof(line), fp))
{
parseLine(line, &process[i],&priority[i],&burst[i],&arrival[i]);
i++;
}
for (j = 0; j < 10; j++){
printf("Process: %d, Priority: %d, Burst: %d, Arrival: %d\n", process[j], priority[j], burst[j], arrival[j]);
}
fclose(fp);
return 0;
}