如何在C语言中从文本文件中读取数字块

如何在C语言中从文本文件中读取数字块,c,file,C,File,我有一个文件numbers.dat,其中包含大约300个列格式的数字(浮点,负-正)。目标是首先用300个数字填写numbers.dat,然后每次将100个数字提取到另一个文件中,比如n1.dat。第二个文件n2.dat将包含numbers.dat中接下来的100个数字,依此类推,用于从numbers.dat获得的3个子集文件。我无法理解如何将上次读取的第100个数字的位置考虑在内,以便下一个块的文件读取和获取发生在previos获取的数字之后 尝试枪手提供的解决方案: FILE *fp = f

我有一个文件numbers.dat,其中包含大约300个列格式的数字(浮点,负-正)。目标是首先用300个数字填写numbers.dat,然后每次将100个数字提取到另一个文件中,比如n1.dat。第二个文件n2.dat将包含numbers.dat中接下来的100个数字,依此类推,用于从numbers.dat获得的3个子集文件。我无法理解如何将上次读取的第100个数字的位置考虑在内,以便下一个块的文件读取和获取发生在previos获取的数字之后

尝试枪手提供的解决方案:

FILE *fp = fopen("numbers.dat","r"); 
FILE *outFile1,*outFile2,*outFile3; 
int index=100; 

char anum[100]; 
while( fscanf(fp,"%s",anum) == 1 ) 
    {
 if(index==100)
     {
// select proper output file based on index.
 fprintf(outFile1,"%s",anum);
     index++; }
     if(index >101)
     {
        fprintf(outFile2,"%s",anum);
     index++; }
}

问题是只写入了一个数据。正确的过程应该是什么?

继续从number.dat读取,并根据当前读取的数字索引写入相应的输出文件

示例代码

FILE *fp = fopen("numbers.dat","r");
FILE *outFile;
int index=0;
char anum[100]; // since we are not calculating, we can store numbers as string
while( fscanf(fp,"%s",anum) == 1 )
{
// select proper output file based on index.
fprintf(outFile,"%s",anum); 
index++;
}

我会为此编写一个程序

read data from input file line-by-line keep a line count based on the current line count copy the line to a specific output file 逐行从输入文件读取数据 记下电话号码 根据当前行数,将行复制到特定的输出文件 像这样的

#include <stdio.h>
#include <stdlib.h>

#define INPUTFILENAME "numbers.dat"
#define MAXLINELEN 1000
#define NFILES 3
#define LINESPERFILE 100
#define OUTPUTFILENAMETEMPLATE "n%d.dat" /* n1.dat, n2.dat, ... */

int main(void) {
    FILE *in, *out = NULL;
    char line[MAXLINELEN];
    int linecount = 0;

    in = fopen(INPUTFILENAME, "r");
    if (!in) { perror("open input file"); exit(EXIT_FAILURE); }
    do {
        if (fgets(line, sizeof line, in)) {
            if (linecount % LINESPERFILE == 0) {
                char outname[100];
                if (out) fclose(out);
                sprintf(outname, OUTPUTFILENAMETEMPLATE, 1 + linecount / LINESPERFILE);
                out = fopen(outname, "w");
                if (!out) { perror("create output file"); exit(EXIT_FAILURE); }
            }
            fputs(line, out);
            linecount++;
        } else break;
    } while (linecount < NFILES * LINESPERFILE);
    fclose(in);
    if (out) fclose(out);
    return 0;
}
#包括
#包括
#定义INPUTFILENAME“numbers.dat”
#定义MAXLINELEN 1000
#定义文件3
#定义LINESPERFILE 100
#定义OUTPUTFILENAMETEMPLATE“n%d.dat”/*n1.dat,n2.dat*/
内部主(空){
文件*in,*out=NULL;
字符行[MAXLINELEN];
int linecount=0;
in=fopen(输入文件名,“r”);
如果(!in){perror(“打开输入文件”);退出(退出失败)}
做{
if(fgets(线条、线条尺寸、英寸)){
如果(行数%LINESPERFILE==0){
char outname[100];
如果(输出)fclose(输出);
sprintf(outname、OUTPUTFILENAMETEMPLATE、1+linecount/LINESPERFILE);
out=fopen(outname,“w”);
如果(!out){perror(“创建输出文件”);退出(退出失败);}
}
FPUT(线路、输出);
linecount++;
}否则就断了;
}而(linecount
如果您能用代码片段解释如何处理多个for循环,是否使用fread或fscanf等,我们将不胜感激。此外,文件中的数字以列格式排列。请参阅我提出建议的编辑问题。然而,一个困惑仍然存在>>在第一个while循环存在之后,第二个程序循环如何开始并继续存储最后一个索引,因为我们没有提到第二个while循环中的索引。只有一个循环,你从哪里得到第二个循环。哦,这是一个打字错误对不起…即使只有i,但索引逻辑仍然不是working@SKM:再次:请张贴那些数字文件(以节略形式),口头描述你想做的事情不够精确!此转换的口头描述不够精确,请发布示例文件
numbers.dat、n1.dat、n2.dat、n3.dat
。使用15而不是300个样本就足够了。@eznme:提供的代码是@Gunner建议的。此处,出口1为n1.dat,出口2为n2.dat,出口3为n3.dat。我坚持使用这个符号,以便更容易与所提供的答案联系起来。问题是Outpile1和Outpile2只包含一个数字,而不是100个数字。所以索引变量和循环不起作用。另外,请注意,通常的初步文件操作(如打开和关闭)已经完成,但上面没有包括。