如何从c中的txt文件正确扫描内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从c中的txt文件正确扫描内容相关的知识,希望对你有一定的参考价值。
这是我的代码,我想做的是从结构如下的文件中扫描fscanf:
Tom Veri 1234567890 HJA彼得·史密特(Peter Schmit)9874561230 ABAJhon Smart 0192837465 DPA哈里汤普森0912354876 PHA
并且在编译我的输出后,奇怪的是为什么会发生:代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int nOfLines(FILE* file);
struct inputAbc
{
char ime[20+1];
char prezime[20+1];
char jmbg[20+1];
char sign[3+1];
};
int main()
{
int nLines, i;
FILE* input = NULL;
FILE* output;
struct inputAbc model_arr[10];
input = fopen("input.txt", "r");
output = fopen("output.txt", "w");
nLines = nOfLines(input);
//printf("%d
", nLines+1);
for(i = 0; i < nLines+1; i++)
{
fscanf(input ,"%s %s %s %s",
model_arr[i].ime, model_arr[i].prezime,
model_arr[i].jmbg, model_arr[i].sign);
}
for(i = 0; i < nLines+1; i++)
{
fprintf(output,
"ime: %s
prezime: %s
jmbg: %s
znakovlje: %s
",
model_arr[i].ime, model_arr[i].prezime,
model_arr[i].jmbg, model_arr[i].sign);
}
return 0;
}
int nOfLines(FILE *file)
{
int lines = 0;
int index;
while(!feof(file))
{
index = fgetc(file);
if(index == '
')
lines++;
}
return lines;
}
答案
以下建议的代码:
- 干净地编译
- 执行所需的功能
- 产生所需的输出
- 消除了一些“魔术”数字
- 消除不需要的变量
- 被评论以帮助OP理解代码
- 在
fscanf()
中使用'max character'修饰符,以避免任何可能的缓冲区溢出和导致的不确定行为 - 消除:
#include <string.h>
,因为在发布的代码中未使用任何关联的功能 - 退出前正确清理(通过关闭打开的文件)。
- 正确检查
fopen()
和fscanf()
的I / O错误 - 用于变量
size_t
和i
的j
,因为它们永远不能小于0
现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
struct inputAbc
{
char ime[20+1];
char prezime[20+1];
char jmbg[20+1];
char sign[3+1];
};
#define MAX_LINES 10
int main( void )
{
FILE* input = NULL;
FILE* output = NULL;
struct inputAbc model_arr[ MAX_LINES ];
if( (input = fopen("input.txt", "r")) == NULL )
{
perror( "fopen to read 'input.txt' failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen for input successful
if( (output = fopen("output.txt", "w") ) == NULL )
{
perror( "fopen to write 'output.txt' failed" );
fclose( input );
exit( EXIT_FAILURE );
}
// implied else, fopen for output successful
size_t i; // file global scope since needed in next code block
for( i = 0; i < MAX_LINES; i++ )
{
if( fscanf(input ,"%20s %20s %20s %3s",
model_arr[i].ime,
model_arr[i].prezime,
model_arr[i].jmbg,
model_arr[i].sign) != 4 )
{
break;
}
}
for( size_t j = 0; j < i; j++ )
{
fprintf(output,
"ime: %s
prezime: %s
jmbg: %s
znakovlje: %s
",
model_arr[j].ime,
model_arr[j].prezime,
model_arr[j].jmbg,
model_arr[j].sign);
}
fclose( input );
fclose( output );
return 0;
}
以上是关于如何从c中的txt文件正确扫描内容的主要内容,如果未能解决你的问题,请参考以下文章
编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。(代码片段