我有一个包含2-3行的文件,每行我想存储在一个char *变量中,然后将其翻译并存储到其他适当的变量中。
不是在unix中,只是在c中,有一个fscanf(%d,%s,%s,1,2,3);就是这样,但在unix中它有点奇怪。
例如:a abc 12 12
将它存储在char msg [20]中,然后msg [20]将存储在4个变量中,一个char,一个char *和两个整数。怎么办呢?
这是我到目前为止所得到的:
int ret_in, in1,file;
char buffer1[BUF_SIZE];
int i =0;
char fn[5] = "file";
char msg[20];
file = open(fn,O_WRONLY|O_CREAT,0644);
//msg = "test";
while(((ret_in = read (file, &buffer1, BUF_SIZE)) > 0))
{
for(i; i<ret_in; i++)
{
if(buffer1[i]!='\n')
msg[i] = buffer1[i];
}
}
printf("%s", msg); //TEST: check msg
close(file);
它在msg变量中存储得很好,但是如果它由4个&#39;项组成。我想存储不同的变量,我该如何有效地做到?
答案 0 :(得分:1)
您可以使用fopen()
打开文件并获取指向文件流的指针。可以将此指针传递给fgets()
以从文件中检索行并将它们存储在缓冲区中。然后可以使用sscanf()
解析此缓冲区。
这是一个如何工作的例子。请注意,这里我使用数组来存储每行的字段组件;你可能有不同的要求。
#include <stdio.h>
#include <stdlib.h>
#define MAX_LINES 100
int main(void)
{
FILE *fp = fopen("my_file.txt", "r");
if (fp == NULL) {
perror("Unable to open file");
exit(EXIT_FAILURE);
}
char buffer[1000];
char id[MAX_LINES];
char msg[MAX_LINES][10];
int val_a[MAX_LINES];
int val_b[MAX_LINES];
size_t lines = 0;
while (fgets(buffer, sizeof buffer, fp) != NULL) {
if (sscanf(buffer, "%c%9s%d%d",
&id[lines], msg[lines], &val_a[lines], &val_b[lines]) == 4) {
++lines;
}
}
for (size_t i = 0; i < lines; i++) {
printf("Line %zu: %c -- %s -- %d -- %d\n",
i+1, id[i], msg[i], val_a[i], val_b[i]);
}
fclose(fp);
return 0;
}
使用此文本文件作为输入:
A abc 12 34
B def 24 68
C ghi 35 79
给出以下输出:
Line 1: A -- abc -- 12 -- 34
Line 2: B -- def -- 24 -- 68
Line 3: C -- ghi -- 35 -- 79