我最近受到启发,启动了一个我想要编写一段时间的项目.我想在C中做,因为内存处理是这个应用程序的关键.我正在四处搜索C中字符串的良好实现,因为我知道我自己这样做会导致一些混乱的缓冲区溢出,我希望处理相当多的字符串.
我发现这篇文章详细介绍了每一个,但他们每个人都觉得他们有很多利弊(不要误会我的意思,这篇文章非常有帮助,但它仍然让我担心,即使我是选择其中之一,我不会使用我能得到的最好的).我也不知道这篇文章是如何更新的,因此我目前的请求.
我正在寻找的是可以容纳大量字符的东西,并简化了搜索字符串的过程.如果它允许我以任何方式标记字符串,甚至更好.此外,它应该有一些非常好的I/O性能.打印和格式化打印不是最重要的.我知道我不应该指望一个库为我做所有的工作,但是如果那里有一个记录良好的字符串函数可以节省我一些时间和一些工作只是徘徊.
任何帮助是极大的赞赏.提前致谢!
编辑:我被问及我喜欢的许可证.任何类型的开源许可都可以,但最好是GPL(v2或v3).
EDIt2:我找到了betterString(bstring)库,它看起来很不错.良好的文档,小而多功能的功能,并且易于与c字符串混合.有没有关于它的好故事?我读到的唯一缺点是它缺乏Unicode(再次,读到这个,还没有看到它面对面),但其他一切似乎都很好.
EDIT3:另外,最好是纯C.
这可能是编程时最常见的任务/问题之一; 您需要在某处存储应用程序的配置.
在我尝试创建Web服务器或其他应用程序时,我希望尽可能保持代码清洁,因为我对编程的主要兴趣是架构.这导致我希望将配置存储在文件中,无需重新编译软件即可对其进行更改.
我不是来重新发明轮子或类似的东西,所以我想做的是在C on*nix上创建一个配置阅读器.配置看起来可能与任何其他软件的配置非常相似; Apache,vsftpd,MySQL等
基本问题是:如何从文本文件中读取并有效地处理每一行(在纯C中)?我需要使用fgetc()和处理每个字符吗?
我正在处理我希望在处理它们时读入缓冲区的小文本文件,所以我想出了以下代码:
...
char source[1000000];
FILE *fp = fopen("TheFile.txt", "r");
if(fp != NULL)
{
while((symbol = getc(fp)) != EOF)
{
strcat(source, &symbol);
}
fclose(fp);
}
...
Run Code Online (Sandbox Code Playgroud)
这是将文件内容放入缓冲区还是滥用的正确方法strcat()?
然后我遍历缓冲区:
for(int x = 0; (c = source[x]) != '\0'; x++)
{
//Process chars
}
Run Code Online (Sandbox Code Playgroud) 我已经开始学习一些C作为一种爱好并且已经盲目地使用FILE作为文件指针的声明很长一段时间了,我一直在想.这是C的关键字或特殊数据类型来处理文件吗?它是否包含文件内的流和其他数据?为什么它被定义为指针?
一个例子来说明我的意思,使其更清晰:
FILE* fp; //<-- this
fp = fopen("datum.txt", "r");
while(!feof(fp)) {
// etc.
}
Run Code Online (Sandbox Code Playgroud) 一个朋友和我对单个函数进行了大讨论,函数本身没有任何意义,但在我看来是错误的。
函数如下:
//get tomorrows date
int getTomorrowsDate(){
sleep(1*60*60*24);
return getCurrentDate();
}
Run Code Online (Sandbox Code Playgroud)
如果我执行函数并得到结果,那已经是错误的了,因为明天已经到了今天。
经过长时间的讨论,我的朋友认为函数在执行时间是正确的,而我则相反,并说函数在结果时间是正确的。请有人向我详细说明为什么我的观点是错误的,因为我不明白。
我把我想通过一个循环,每次检查流的有效性的答案在这里.
我使用的原始代码good与此类似:
ifstream foo("foo.txt");
while (foo.good()){
string bar;
getline(foo, bar);
cout << bar << endl;
}
Run Code Online (Sandbox Code Playgroud)
我立刻指着这里告诉我永远不要测试good.显然,这是我无法理解的,但我想正确地进行文件I/O.
我用几个例子测试了我的代码,但无法使测试good代码失败.
首先(这打印正确,以新行结束):
bleck 1 blee 1
2
blah
以新行结束
第二个(正确打印,以最后一行结束):
bleck 1 blee 1
2
blah
这不会以新的一行结束
第三个是一个空文件(正确打印,一个换行符.)
第四个是丢失的文件(这没有正确打印.)
有人可以用一个例子来帮助我,说明为什么 good不应该做测试?
我打开了一个文件,在指针的地址找到了流ptr.我试图查看文件是否为空.使用以下内容
if (fgetc(ptr) != EOF)
Run Code Online (Sandbox Code Playgroud)
按预期工作.当文件为空时,不执行该语句.当文件不为空时,不执行该语句.
但是,使用
if (!feof(ptr))
Run Code Online (Sandbox Code Playgroud)
总是执行声明.
为什么会这样?有没有办法使用这个feof功能?
考虑将这个小程序编译为 application.exe
#include <stdio.h>
int main()
{
char str[100];
printf ("Hello, please type something\n");
scanf("%[^\n]s", &str);
printf("you typed: %s\n", str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我使用此代码启动application.exe并获取其输出.
#include <stdio.h>
#include <iostream>
#include <stdexcept>
int main()
{
char buffer[128];
FILE* pipe = popen("application.exe", "r");
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != NULL)
printf(buffer);
}
pclose(pipe);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在我输入之前没有输出.然后获取两个输出行.我可以通过在第一个printf语句后添加此行来解决此问题.
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)
然后在我按预期输入之前获取第一行.
但是,如何获取我无法修改且不能fflush()在"实时"中使用的应用程序的输出(在退出之前的意思)?.windows cmd是如何做到的?
通常,为了向连接到Linux终端上的标准输入的程序指示EOF,如果我只按Enter键,则需要按Ctrl + D一次,否则按两次.但我注意到patch命令不同.有了它,如果我按下Enter键,我需要按两次Ctrl + D,否则按三次.(cat | patch相反,如果我在输入任何实际输入之前按下Ctrl + D,它就没有这种奇怪之处.)深入研究patch源代码,我追溯到它的方式循环fread.这是一个做同样事情的最小程序:
#include <stdio.h>
int main(void) {
char buf[4096];
size_t charsread;
while((charsread = fread(buf, 1, sizeof(buf), stdin)) != 0) {
printf("Read %zu bytes. EOF: %d. Error: %d.\n", charsread, feof(stdin), ferror(stdin));
}
printf("Read zero bytes. EOF: %d. Error: %d. Exiting.\n", feof(stdin), ferror(stdin));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在完全按原样编译和运行上述程序时,这是事件的时间表:
fread.fread调用read系统调用.read系统调用返回5.freadread再次呼叫系统呼叫.我的代码就像一个文本压缩器,读取普通文本并变成数字,每个单词都有一个数字.它在DevC++中编译但不会结束,但是它不能在Ubuntu 13.10中编译.我收到的错误就像Ubuntu中的标题"未定义引用`strlwr'",我的代码有点长,所以我无法在这里发布,但其中一个错误来自:
//operatinal funcitons here
int main()
{
int i = 0, select;
char filename[50], textword[40], find[20], insert[20], delete[20];
FILE *fp, *fp2, *fp3;
printf("Enter the file name: ");
fflush(stdout);
scanf("%s", filename);
fp = fopen(filename, "r");
fp2 = fopen("yazi.txt", "w+");
while (fp == NULL)
{
printf("Wrong file name, please enter file name again: ");
fflush(stdout);
scanf("%s", filename);
fp = fopen(filename, "r");
}
while (!feof(fp))
{
while(fscanf(fp, "%s", textword) == 1)
{
strlwr(textword);
while (!ispunct(textword[i]))
i++;
if (ispunct(textword[i]))
{
i = 0; …Run Code Online (Sandbox Code Playgroud)