从 C 文件中读取字符串和整数的组合
Reading combinations of string and integer from file in C
我是C语言的新手,所以请多多包涵。我试图读取一个包含字符串的文件,但获得的输出是单个字符。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define CALLOC(num, type) ((char*)calloc (num, sizeof(char)))
#define FREE(addr) (free((void*) (addr)))
int i, count;
char *x, *y, *z;
int main (void)
{
FILE *stream;
if ( (stream = fopen ( "test.txt", "r" )) == NULL )
{ printf ("Cannot read the new file\n");
exit (1);
}
count = 3;
x=CALLOC(count, char);
y=CALLOC(count, char);
z=CALLOC(count, char);
for ( i=0; i<count; i++ )
{ fscanf (stream,"%c %c %c", &x[i], &y[i], &z[i]);
printf ("\n %d %c %c %c ", i, x[i], y[i], z[i]);
}
FREE(x);
FREE(y);
FREE(z);
fclose (stream);
}
输入test.txt文件包含
1 ab 1
2 aa 5
1 cc 1
当前输出
0 1 a b
1 1 2
2 a a
预期输出
0 1 ab 1
1 2 aa 5
2 1 cc 1
我怀疑我是否应该使用字符数组,但它似乎不起作用,我觉得使用 char 读取 int 是可以接受的。在这里我需要预期的输出,为此任何 method/suggestion 表示赞赏。
%c
只读取一个字符。所以它不会将 ab
读取为单个字符。您在文件中的行和您的格式无法正确读取整行。
一个简单的方法是使用 fgets()
并打印整行:
char line[256];
i = 0;
while(fgets(line, sizeof line, stream))
{
printf ("%d %s", i, line);
i++;
}
顺便说一句,calloc
和 free
的宏是不必要的。与直接使用这些函数相比,它们并没有使代码更易于阅读。
问题是您有扫描文件。 %c 读取一个 8 位值。您扫描了 3 个字符,但文件包含 4 个字符。如果你不使用是x,y,z的值我不明白为什么要用malloc
这里是工作来源:
#include <stdio.h>
#include <stdlib.h>
int main() {
int count,i;
char w,x,y,z;
FILE *stream;
if((stream = fopen("test.txt","r")) == NULL) {
printf("Cannot read the new file\n");
return 1;
}
count = 3;
for(i=0;i<count;++i) {
fscanf(stream,"%c %c%c %c\n",&w,&x,&y,&z);
printf("%d %c %c%c %c\n",i,w,x,y,z);
}
return 0;
}
for ( i=0;i<count; i++ )
{
fscanf (stream,"%s %s %s", x, y, z);
printf ("\n %d %s %s %s ", i, x, y, z);
}
您可以将循环修改为 this.This 循环将读取文件直到 end of file
并且您必须使用 %s
因为 ab
是一个字符串而不是字符所以它可以't 存储在 char 变量中。
我是C语言的新手,所以请多多包涵。我试图读取一个包含字符串的文件,但获得的输出是单个字符。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define CALLOC(num, type) ((char*)calloc (num, sizeof(char)))
#define FREE(addr) (free((void*) (addr)))
int i, count;
char *x, *y, *z;
int main (void)
{
FILE *stream;
if ( (stream = fopen ( "test.txt", "r" )) == NULL )
{ printf ("Cannot read the new file\n");
exit (1);
}
count = 3;
x=CALLOC(count, char);
y=CALLOC(count, char);
z=CALLOC(count, char);
for ( i=0; i<count; i++ )
{ fscanf (stream,"%c %c %c", &x[i], &y[i], &z[i]);
printf ("\n %d %c %c %c ", i, x[i], y[i], z[i]);
}
FREE(x);
FREE(y);
FREE(z);
fclose (stream);
}
输入test.txt文件包含
1 ab 1
2 aa 5
1 cc 1
当前输出
0 1 a b
1 1 2
2 a a
预期输出
0 1 ab 1
1 2 aa 5
2 1 cc 1
我怀疑我是否应该使用字符数组,但它似乎不起作用,我觉得使用 char 读取 int 是可以接受的。在这里我需要预期的输出,为此任何 method/suggestion 表示赞赏。
%c
只读取一个字符。所以它不会将 ab
读取为单个字符。您在文件中的行和您的格式无法正确读取整行。
一个简单的方法是使用 fgets()
并打印整行:
char line[256];
i = 0;
while(fgets(line, sizeof line, stream))
{
printf ("%d %s", i, line);
i++;
}
顺便说一句,calloc
和 free
的宏是不必要的。与直接使用这些函数相比,它们并没有使代码更易于阅读。
问题是您有扫描文件。 %c 读取一个 8 位值。您扫描了 3 个字符,但文件包含 4 个字符。如果你不使用是x,y,z的值我不明白为什么要用malloc
这里是工作来源:
#include <stdio.h>
#include <stdlib.h>
int main() {
int count,i;
char w,x,y,z;
FILE *stream;
if((stream = fopen("test.txt","r")) == NULL) {
printf("Cannot read the new file\n");
return 1;
}
count = 3;
for(i=0;i<count;++i) {
fscanf(stream,"%c %c%c %c\n",&w,&x,&y,&z);
printf("%d %c %c%c %c\n",i,w,x,y,z);
}
return 0;
}
for ( i=0;i<count; i++ )
{
fscanf (stream,"%s %s %s", x, y, z);
printf ("\n %d %s %s %s ", i, x, y, z);
}
您可以将循环修改为 this.This 循环将读取文件直到 end of file
并且您必须使用 %s
因为 ab
是一个字符串而不是字符所以它可以't 存储在 char 变量中。