所以我写一个代码以获取scanf文本文件并返回格式文本消息日志。我很想知道如何在某个点扫描文件并在文件扫描行时打印出E.x以外的每个字符串" 332982000 205552002 2055551001 7韦伯先生,我可以问你一个问题吗?"我在整数时扫描前4个数字,并将其余的书面文本扫描为" Webb先生"的字符阵列。
我尝试使用fscanf使用for循环以扫描到一个数组中,但它不起作用。我还认为我可以使用malloc来节省空间,但我不知道该尺寸的论点要做什么。任何帮助将不胜感激!
int posix;
int phone1;
int phone2;
int textsize;
int val, val2;
char line[256];
char text[3000];
int len=strlen(line);
int i=0;
printf("nnTime %s %s", argv[2], argv[3]);
printf("n======================================================================================nnn");
FILE* textfile= fopen(argv[1],"r");
fscanf(textfile, "%d %d %d %d %s", &posix, &phone1, &phone2, &textsize, text);
while( fgets(line, sizeof(line), textfile) ) {
val= atoi(argv[2]);
val2=atoi(argv[3]);
if ( (val==phone1) && (val2==phone2) ) {
printf(" %s ", text); //only prints Mr
text=(char*)malloc(sizeof())//tried malloc but not too sure how to use it correctly
for (i=0; i<len; i++) { //tried using for loop here didnt work.
fscanf("%s", text);
}
sortText(phone1, phone2, textsize, text);
//readableTime(posix);
}
else if(((val2 == phOte1) printf("%s",text);
sortText(phone1, phone2, textsize, text);
//readableTime(posix);
}
fscanf(textfile, "%d %d %d %d %s", &posix, &phone1, &phone2, &textsize, text);
}
fclose(textfile);
return 0;
}
首先,将整个文件读取到malloc'd char数组中。FSEEK和FTELL为您提供文件大小:
// C99
FILE *fp = fopen("file", "r");
size_t filesize;
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
fseek(fp, 0, SEEK_SET);
char *filetext = malloc(filesize + 1);
fread(filetext, 1, filesize, fp);
filetext[filesize] = 0;
然后,将缓冲区用于一条线条,其大小与整个文件的大小相同,因此您肯定具有足够的尺寸。sscanf()可用于从字符串中读取内容。
int readbytes;
for(int i=0; i < filesize; i+=readbytes) {
char line[filesize];
int posix, phone1, phone2, textsize;
if(EOF == sscanf(
&filetext[i], "%d%d%d%d%[^n]%n", &posix, &phone1,
&phone2, &textsize, line, &readbytes))
{
break;
}
printf("%d %d %d %d '%s' %dn", posix, phone1, phone2, textsize, line, readbytes);
}
格式指定'%[^ n]'的意思是:每个字符,直到下一个newline字符。格式指定'%n'为您的字节数量为您的字节数量到目前为止,从而有效地使用了该sscanf调用的字节,您可以使用该字节来推进迭代器。