我的输入文件包含以下内容:
w 7b034d90
r 7b034c68
r df84d4
如何将第一个字符读入并存储到变量中,将第二个字符存储在另一个变量中?必须对几行输入进行此操作。
例如,我需要将变量A
和7b034d90存储到变量B
中。这必须在几千行中完成,每行的第一个字符将是w或r。解决这个问题的最佳方式是什么?
这是我的代码:
struct MemBlock
{
char address
char ReadorWrite;
};
struct MemBlock blocks[100]
int main (int argc, char *argv[])
{
int line = 0;
static const char filename[] = "sampleTest.txt";
FILE *file = fopen ( filename, "r" );
if (fp == NULL)
{
printf ("Error opening the file\n\n'");
exit(EXIT_FAILURE);
} else {
if (argc == 3)
{
for (i=0,i<100,i++)
{
while ( fgets ( line, sizeof line, file ) != NULL )
{
r = fscanf(fp, "%s %s\n", blocks[i].ReadOrWrite, blocks[i].address);
line++;
}
}
fclose(fp);
}
}
答案 0 :(得分:0)
如果您不知道有多少对,则需要通过某种机制跟踪它们。一个是malloc并将它们链接到一个列表中。为此,请添加指向结构的指针。
所以流程将类似于下面的伪代码。它需要结构定义,错误代码,API文件调用是正确的,并确保链接列表是正确的。
struct Memblock head;
struct Memblock *oldp = &head;
main() {
fp = fopen(file);
while (fgets(line, fp, sizeof(line)-1) != NULL) {
if (sscanf(line, "%c %d", &flag, &address) == 2) {
sp = malloc(sizeof(struct));
sp->flag = flag;
sp->address = address;
sp->next = NULL;
oldp->next = sp;
}
}
}
答案 1 :(得分:0)
让我们假设OP在完成时想要一个struct MemBlock
数组
C伪代码(省略错误处理)
struct MemBlock {
unsigned long address; // Data is obviously hexadecimal
char ReadorWrite;
};
FILE *inf = fopen(filename, "rt"); // Use "rt"
size_t line = 0;
char buffer[1+1+16+2+100]; // big enough for expected letter and number + change
while (fgets(buf, sizeof buf, inf) != NULL) line++;
frewind(inf);
struct MemBlock *Array = calloc(line, sizeof *Array);
for (size_t i = 0; i< line; i++) {
if (fgets(buf, sizeof buf, inf) != NULL)) handle error
if (2 !=sscanf("%c%lx", &Array[i].ReadorWrite, &Array[i].address)) handle error
}
fclose(inf);
// Use Array[] with length `line`.
...
free(Array)
我喜欢一遍链接列表的想法,但想提供另一个POV。
答案 2 :(得分:0)
有两种方法,例如sscanf()
或使用strchr()
或c ++,类似http://www.boost.org/doc/libs/1_54_0/libs/filesystem/example/tut3.cpp