当前位置:首页 » 编程语言 » 大文件解析c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

大文件解析c语言

发布时间: 2022-09-19 23:35:45

㈠ 如何用c语言高效的读取一个很大的txt数据文件

#include <stdio.h>
#include <string.h>

#define MAXSIZE 4000000

struct password {
char psw[12]; // 密码名称
int counter; // 出现次数计数器
};

int Append(struct password a[], int *n, char psw[]) {
int i;
for(i = 0; i < *n; ++i) {
if(strcmp(a[i].psw,psw) == 0) {
++a[i].counter;
return 2;
}
}
if(*n < MAXSIZE) {
strcpy(a[*n].psw,psw);
a[*n].counter = 1;
++(*n);
return 1;
}
return 0;
}

int main() {
struct password a[MAXSIZE];
char psw[12];
int i,n = 0,id;
char infilename[] = "indata.txt";
char outfilename[] = "outdata.txt";
FILE *inf,*outf;
if((inf = fopen(infilename,"rt")) == NULL) {
printf("不能打开数据文件:%s。\n",infilename);
return 1;
}
while(fscanf(inf,"%d %11s",&id,psw) == 2) {
if(Append(a,&n,psw) == 0) break;
}
fclose(inf);
if((outf = fopen(outfilename,"wt")) == NULL) {
printf("不能打开数据文件:%s。\n",outfilename);
return 2;
}
for(i = 0; i < n; ++i)
fprintf(outf,"%s %d\n",a[i].psw,a[i].counter);
fclose(outf);
return 0;
}
估计可能是数组越界,修改如下:
int Append(struct password a[], int *n, char psw[]) {
int i;
for(i = 0; i < *n && i < MAXSIZE; ++i) {
if(strcmp(a[i].psw,psw) == 0) {
++a[i].counter;
return 2;
}
}
if(*n < MAXSIZE) {
strcpy(a[*n].psw,psw);
a[*n].counter = 1;
++(*n);
return 1;
}
return 0;
}

㈡ c语言如何读写大型的txt文件

#include<stdio.h>
#include<string.h>

#defineMAXSIZE4000000

structpassword{
charpsw[12];//密码名称
intcounter;//出现次数计数器
};

intAppend(structpassworda[],int*n,charpsw[]){
inti;
for(i=0;i<*n;++i){
if(strcmp(a[i].psw,psw)==0){
++a[i].counter;
return2;
}
}
if(*n<MAXSIZE){
strcpy(a[*n].psw,psw);
a[*n].counter=1;
++(*n);
return1;
}
return0;
}

intmain(){
structpassworda[MAXSIZE];
charpsw[12];
inti,n=0,id;
charinfilename[]="indata.txt";
charoutfilename[]="outdata.txt";
FILE*inf,*outf;
if((inf=fopen(infilename,"rt"))==NULL){
printf("不能打开数据文件:%s。 ",infilename);
return1;
}
while(fscanf(inf,"%d%11s",&id,psw)==2){
if(Append(a,&n,psw)==0)break;
}
fclose(inf);
if((outf=fopen(outfilename,"wt"))==NULL){
printf("不能打开数据文件:%s。 ",outfilename);
return2;
}
for(i=0;i<n;++i)
fprintf(outf,"%s%d ",a[i].psw,a[i].counter);
fclose(outf);
return0;
}

㈢ C语言大文件操作疑问(fseek)

是有这个限制的。
如果使用的标准的c函数的。
如果是你是32操作系统,c语言操作文件的大小是 2^31 ,2G

如果是你是64操作系统,c语言操作文件的大小是.2^63 ,8589934592 G


你说的问题肯定,出在32位操作系统上。
一是:
操作系统能不能允许创建2G以上的文件了,具体要看操作系统了。
如果不允许,你的问题就没什么意义了!
如果操作系统允许的话,都会提供,系统函数让你调用的。
你得自己去找资料了。
===============
你可以看一下,sqlite的源代码,我的3-5-4版本
他不用是用c语言标准库的。函数,能windows提供的系统函数SetFilePointer,ReadFile

static int winRead(
sqlite3_file *id, /* File to read from */
void *pBuf, /* Write content into this buffer */
int amt, /* Number of bytes to read */
sqlite3_int64 offset /* Begin reading at this offset */
){
LONG upperBits = (offset>>32) & 0x7fffffff;
LONG lowerBits = offset & 0xffffffff;
DWORD rc;
DWORD got;
winFile *pFile = (winFile*)id;
assert( id!=0 );
SimulateIOError(return SQLITE_IOERR_READ);
OSTRACE3("READ %d lock=%d\n", pFile->h, pFile->locktype);
rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){
return SQLITE_FULL;
}
if( !ReadFile(pFile->h, pBuf, amt, &got, 0) ){
return SQLITE_IOERR_READ;
}
if( got==(DWORD)amt ){
return SQLITE_OK;
}else{
memset(&((char*)pBuf)[got], 0, amt-got);
return SQLITE_IOERR_SHORT_READ;
}
}

㈣ 如何用c语言打开大文本文件的数据

不管有多大 逐行读取 逐行处理
内存足够大的话 你也可以一次性读到内存里面 不过不推荐
由于不知道你合并的规则 只能说这些了

㈤ c语言处理文件里的大数据

C语言处理大数据一般有三种处理方法:
1、分段处理,即无论文件多大,程序中使用的永远只是一小段部分,可以使用一个缓冲区,根据用户交互输入,分段的输出。
2、使用内存文件映射,这是最常用的文件的处理方法,Linux和Windows都提供一种内存文件映射的机制,以Windows为例,可以调用 CreateFile()、 CreateFileMapping()以及 MapViewOfFile()三个函数来完成内存文件映射。
3、使用数据库,借助SQL查询语言对大数据进行操作。

㈥ c语言中如何对文件数据进行拆分定位,即读取文件数据,对文件解析

拆分定位?没看懂。。。是不是分成几个部分?那就先fseek到‘一个部分的大小(sizeof (part))乘以 i ’处,然后在直接fread了。不知道是不是你要的。

㈦ C语言高速读大文件、写大文件的方式

写文件一般是追加快些
如果你要输出例如XML。
还有,每个进程应该有4G,靠操作系统内存管理+页面文件维持、
还有,开个几百M的数组不划算、用malloc+free快些,可以动态的,不让操作系统在加载时就开辟几百M,而是陆续的开——除非你在写汇编程序——汇编向OS申请内存很费劲,要 SYSCALL

㈧ C语言读大文件问题

如果是文本文件的格式,而且你的文件有很大肯定不能随机读取的,所以使用任何编程语言都需要很长的时间。
如果是有固定的记录格式,则可以使用fseek定位文件指针随机读写

㈨ C语言,大文件读取,每行长度不固定,fgets是一行一行读,怕速度慢,能不能多行读取

那么用fread读取到固定字节的buf+offset,分离出完整行, 把最后一个'\n'后截断的数据memmove到buf首地址,更新offset到截断数据尾。下次从截断数据尾部buf + offset继续读取。

如果不知一行的最大长度,遇到读满buf拼不出一行的情况时,用realloc扩大buf的尺寸。

㈩ 用C语言读取一个文件中的内容,如何对不同的行进行解析,比如是配置文件

很简单的

配置文件 微软有抓们的一套解析函数

INI文件是Windows系统中一类比较重要的文件,通常用来存放系统或者应用程序的配置信息,以方便系统或者应用 程序在初始化时再次读入。比如Windows系统中的配置文件win.ini和system.ini,它们就主要存放系统启动或用户登陆时的系统信息。这 项功能在方便了系统配置的同时,也为非法程序的自动运行提供了可乘之机。显然,这类文件的重要性应该引起我们的重视。但是对于这样的ini文件的读写操作 却与普通文本文件有着种种的不同,尤其体现在编程实现上。笔者曾经尝试用手动更改的方法在文件中加入一些项,使得自己的程序能够在初始化时自动运行,但是 却没有成功,最后还是借由编程的方法来实现了。这里主要涉及到一些API函数,而这些函数又往往不被人们所熟知,本文的任务就是在介绍这些函数的同时,用 简单的程序作了示例,下面我们言归正传。
先来看几个往配置文件中写入信息的函数:
(1)WritePrivateProfileSection()用来在ini文件中直接向指定区域写入键和值的信息,其原型如下:
BOOL WritePrivateProfileSection(
LPCTSTR lpAppName, // 指向指定字段的字符串
LPCTSTR lpString, // 指向要写入的键与值字符串
LPCTSTR lpFileName // 指向文件名称字符串,如果不包含完整路径,则在windows目录下创建
);
用法示例:
WritePrivateProfileSection(_T(“windows”),_T(“load=c:\\winnt\\notepad.exe”),_T(“c:\\winnt\\win.ini”));
(2)WritePrivateProfileString()与上一个函数的不同点在于其将键和值分开了,原型如下:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 指向指定字段的字符串
LPCTSTR lpKeyName, // 指向指定键的字符串
LPCTSTR lpString, // 指向指定值的字符串
LPCTSTR lpFileName // 指向文件名称字符串
);
用法示例:
WritePrivateProfileString(_T(“windows”),_T(load”)_T(“c:\\winnt\\notepad.exe”),_T(“c:\\winnt\\win.ini”));
(3)WritePrivateProfileStruct()与前面两个的不同在于文件尾有校验和,原型如下:
BOOL WritePrivateProfileStruct(
LPCTSTR lpszSection, //指向指定字段的字符串
LPCTSTR lpszKey, //指向指定键的字符串
LPVOID lpStruct, //指向存放要加入的数据的缓冲区,如果为NULL,则删除键
UINT uSizeStruct, //缓冲区大小,以字节为单位
LPCTSTR szFile //以零结尾的文件名称字符串,如果为空,则向win.ini写入
);
用法示例:
WritePrivateProfileStruct(_T(“windows”),_T(“load”),pBuffer,sizeof(pBuffer),_T(“c:\\winnt\\win.ini”));
(4)还有两个函数,是专门用来向win.ini文件写入的,函数原型如下:
BOOL WriteProfileSection(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpString //指向指定值的字符串
);
BOOL WriteProfileString(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向指定键的字符串
LPCTSTR lpString //指向指定值的字符串
);
下面来看几个对应的从ini文件获取信息的API函数,上面已经说得很详细了,这里只说其中两个:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向键的字符串
LPCTSTR lpDefault, //如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量
LPTSTR lpReturnedString, //存放INI文件中值的目的缓存
DWORD nSize, //目的缓冲区的大小,以字节为单位
LPCTSTR lpFileName //指向INI文件名称的字符串
);

UINT GetPrivateProfileInt(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向键的字符串
INT nDefault, //如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量
LPCTSTR lpFileName //指向INI文件名称的字符串
);
程序示例1: 我们在这里建立了一个应用程序“App Name”,并且使用了一个INI文件“appname.ini”,在此INI文件中,我们写入如下内容:
[Section1]
FirstKey = It all worked out okay.
SecondKey = By golly, it works.
ThirdKey = Another test.
代码分析如下:
#include <stdio.h>
#include <windows.h>
//主函数
main()
{
//定义局部
CHAR inBuf[80];
HKEY hKey1, hKey2;
DWORD dwDisposition;
LONG lRetCode;
// 试图创建INI文件的键值
lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT
\\CurrentVersion\\IniFileMapping\\appname.ini",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
NULL, &hKey1,
&dwDisposition);
//判断是否出错
if (lRetCode != ERROR_SUCCESS){
printf ("Error in creating appname.ini key\n");
return (0) ;
}
//试图设置一个节区的值
lRetCode = RegSetValueEx ( hKey1,
"Section1",
0,
REG_SZ,
"USR:App Name\\Section1",
20);
//判断是否出错
if (lRetCode != ERROR_SUCCESS) {
printf ( "Error in setting Section1 value\n");
return (0) ;
}
//试图创建一个应用名称键值
lRetCode = RegCreateKeyEx ( HKEY_CURRENT_USER,
"App Name",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
NULL, &hKey2,
&dwDisposition);

//判断是否出错
if (lRetCode != ERROR_SUCCESS) {
printf ("Error in creating App Name key\n");
return (0) ;
}
//强制系统重新读取映射区的内容到共享内存中,以便于将来对应用程序的调用可//以找到它,而不需要重新启动系统
WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" );
//向INI文件中添加一些键值
WritePrivateProfileString ("Section1", "FirstKey",
"It all worked out okay.", "appname.ini");
WritePrivateProfileString ("Section1", "SecondKey",
"By golly, it works.", "appname.ini");
WritePrivateProfileSection ("Section1", "ThirdKey = Another Test.",
"appname.ini");
//测试一下添加的正确性
GetPrivateProfileString ("Section1", "FirstKey",
"Bogus Value: Get didn't work", inBuf, 80,
"appname.ini");
printf ("%s", inBuf);
return(0);
}

程序示例2:通过修改win.ini中的字段[windows]中的键load或run,或者是为system.ini中的字段[boot]中的键 shell增加值,可以达到设置程序自动运行的目的。假设我们要自动运行notepad.exe,修改后的win.ini或system.ini文件象这 样就可以:
win.ini
[windows]
load=c:\winnt\notepad.exe
run=c:\winnt\notepad.exe

system.ini
[boot]
shell=c:\winnt\explorer.exe c:\winnt\notepad.exe
注意:system.ini文件的修改要特别注意,如果你单纯改成shell=c:\winnt\notepad.exe,则不能首先运行 explorer.exe,很明显你将看不到桌面和任务栏,呵呵,笔者在做实验时就曾因为粗心造成了这样的后果,不过不用害怕,只要你用我们下面提供的程 序,将它修改过来就可以了,默认时,系统在system.ini中的[boot]下是shell=c:\winnt\explorer.exe。很多非法 程序就是通过修改这两个文件来达到自启动的目的的。
下面这个程序可以在附书光盘中找到,名称为“AutoPlay”,使用VC++6.0写成,核心程序源代码如下:
void CAutoRunDlg::OnBrowse()
{
//只浏览exe文件
CfileDialog fileDlg(TRUE,_T("EXE"),_T("*.exe"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(_T("Executable Files (*.exe) |*.exe ||")));//显示打开文件的对话框

//当操作者选择OK时,程序取得选择文件的全路径名(包括文件的路径及文件名称),并将相应的数值传输给相关的控件变量。
if(fileDlg.DoModal()==IDOK)
{
m_strFileName=fileDlg.GetPathName();

//向将变量中的数值传输给控件显示出来。
UpdateData(FALSE);
}
}
void CAutoRunDlg::OnApply()
{
//更新数据
UpdateData(TRUE);
//写入ini文件
LPCTSTR filename;
filename=m_strFileName;
WritePrivateProfileString(_T("windows"),_T("load"),filename,_T("c:\\winnt\\win.ini"));
}

您如果要更改system.ini,可以将WritePrivateProfileString(_T("windows"),_T("load"),filename,_T("c:\\winnt\\win.ini"));
改为 WritePrivateProfileString(_T("boot"),_T("shell"),filename,_T("c:\\winnt \\system.ini"));并且在输入文件名时输入c:\winnt\explorer.exe c:\winnt\notepad.exe。
写到这里,本文的意图基本达到,如果您可以把某些代码亲自实现,相信读者会有比较大的收获。