Tag: io

读取每个30字节大二进制文件的最快方法?

读取大型二进制文件(2-3 GB)的每30个字节的最快方法是什么? 我已经读过由于I / O缓冲区而导致fseek出现性能问题,但我不想在抓取每30个字节之前将2-3 GB的数据读入内存。

fprintf不工作

我正在测试fprintf()的用法,但它无法正常工作。 当我第一次编写代码时,我忘了在fprintf()添加\n并且它有效。 但是,当我在“test 1 2”开头添加\n时,它停止工作。 #include #include int main () { FILE* f = fopen(“test.txt”, “r+”); if( f == NULL) return 0; char str[4][10]; for(int a = 0; a <= 3; ++a) { fscanf(f, " %[^\t\n]s", str[a]); printf("%s\n", str[a]); } fprintf(f, "\ntest 1 2\n"); fclose(f); system("pause"); return 0; } 和我的test.txt包含(而不是\t和\n我按Tab键并输入文件,但我无法在此处管理) ab \ tcd \ te […]

在C中,解析一个由多个空格分隔的整数组成的字符串

我试图使用C将包含多行空白分隔整数的文件解析为动态int数组的动态数组。 每行都是数组数组中的数组。 每行中的行数和元素是非常量的。 到目前为止我所做的是使用fgets将每一行作为字符串抓取。 但是,我无法弄清楚如何解析一串空格分隔的整数。 我以为我可以使用sscanf(因为fscanf可以用来解析整个空格分隔的整数文件)。 但是,似乎sscanf具有不同的function。 sscanf只解析字符串中的第一个数字。 我的猜测是,因为该行是一个字符串不是一个流。 我已经四处查找了一种从字符串中创建流的方法,但它看起来并不像C中那样(我无法使用非标准库)。 char* line; char lineBuffer[BUFFER_SIZE]; FILE *filePtr; int value; … while((line = fgets(lineBuffer, BUFFER_SIZE, filePtr)) != NULL) { printf(“%s\n”, lineBuffer); while(sscanf(lineBuffer, “%d “, &value) > 0) { printf(“%d\n”, value); } } 有什么东西可以用来解析字符串。 如果没有,是否有整个系统的替代品? 我宁愿不使用REGEX。

如何对涉及IO的c函数进行unit testing?

我在将unit testing写入涉及IO操作的C函数时面临问题。 例如,下面是我编写的代码,用于从控制台获取用户的输入字符串。 我不知道如何使用getchar()函数自动测试用户输入。 char * GetStringFromConsole() { char *strToReturn = NULL; int len = 128; strToReturn = (char*)malloc(len); if (strToReturn) { int ch; char *ptr = strToReturn; int counter = 0; for (; 😉 { ch = getchar(); counter++; if (counter == len) { strToReturn = realloc(strToReturn, len*=2 ); ptr = strToReturn + counter-1; […]

为什么scanf似乎跳过输入?

我对以下程序中scanf的行为感到困惑。 scanf似乎输入一次,然后不再输入,直到打印出一串字符。 下面是C程序 #include int main() { int i, j=0; do { ++j; scanf(“%d”, &i); printf(“\n\n%d %d\n\n”, i, j); } while((i!=8) && (j<10)); printf("\nJ = %d\n", j); return 0; } 在这里,直到我输入任何整数程序工作完全正常,但是当输入一个字符时,它继续打印i的最后一个输入值并且永远不会停止(直到循环退出时j为10),以便scanf接受下一个输入。 output:: 1 <—–1st input 1 1 2 <—- 2nd input 2 2 a <—- character input 2 3 2 4 2 5 2 6 […]

fwrite() – 大小和计数对性能的影响

关于fwrite()中两个参数’size’和’count’的目的似乎有很多混淆。 我想弄清哪个会更快 – fwrite(source, 1, 50000, destination); 要么 fwrite(source, 50000, 1, destination); 这是我的代码中的一个重要决定,因为此命令将执行数百万次。 现在,我可以跳转到测试并使用提供更好结果的那个,但问题是该代码适用于多个平台。 所以, 如何才能获得跨平台更好的答案? fwrite()的实现逻辑会因平台而异吗? 我意识到有类似的问题( fread / fwrite将大小和计数作为参数的原理是什么? fwrite和写入大小的性能 )但是要明白这是关于同一问题的另一个问题。 在这种情况下,类似问题的答案是不够的。

文件读写到同一个文件?

我设法打开一个文件,并在写入另一个文件时读取var=fopen(file,”r”) / “w”但即使使用r +或w +模式,我也无法打开文件并更改其内容。 想象一下: int formatacao (char original[]){/*se a cadeia nao tiver escrita em maiusculas, esta funçao vai alteralas para tal*/ int val1; FILE * original_open; original_open = fopen (original,”r+”); if (original_open==0){ printf (“ficheiro %c 1.”,original); } while ((val1=fgetc(original_open))!=EOF){ if (val1>=’a’&&val1<='z'&&val1){ fputc(val1-32,original_open); } else fputc(val1,original_open); } fclose (original_open); return (0); } 代码工作,没有错误,没有警告,唯一的问题是:如果我像这样使用它,它会删除文件中的内容但这样可行: int […]

在C中动态指定scanf的最大字符串长度(如printf中的“%* s”)

我可以使用这种技术指定scanf读取buffer的最大字符数: char buffer[64]; /* Read one line of text to buffer. */ scanf(“%63[^\n]”, buffer); 但是如果我们在编写代码时不知道缓冲区长度怎么办? 如果它是函数的参数怎么办? void function(FILE *file, size_t n, char buffer[n]) { /* … */ fscanf(file, “%[^\n]”, buffer); /* WHAT NOW? */ } 此代码容易受到缓冲区溢出的影响,因为fscanf不知道缓冲区有多大。 我记得以前见过这个,并开始认为这是解决问题的方法: fscanf(file, “%*[^\n]”, n, buffer); 我的第一个想法是”%*[*^\n]”表示最大字符串大小传递参数(在本例中为n )。 这就是printf *的含义。 当我检查scanf的文档时,我发现它意味着scanf应该丢弃[^\n] 。 这让我有些失望,因为我认为能够为scanf动态传递缓冲区大小是一个非常有用的function。 有什么办法可以动态地将缓冲区大小传递给scanf吗?

优化C代码中的I / O(输出)+循环

我有一个代码从stdin读取(10 ^ 5)int(s)然后执行## i后在stdout输出它们。 我通过使用“setvbuf”和使用“fgets_unlocked()”读取行来处理INPUT部分,然后解析它们以获得所需的int(s)。 我有2个问题,我无法解决: 1.)因为我在stdout上打印了500万,花了很多时间:有什么方法可以减少它(我尝试使用fwrite()但o / p打印出不可打印的字符,因为使用fread的原因读入int缓冲区 ) 2.)解析int(s)的输入后说’x’我实际上通过对循环中的no执行%(mod)来找到除数的数量。(参见下面的代码):也许这也是一个我的代码超时的原因:对此有任何改进建议。 非常感谢这实际上是来自http://www.codechef.com/problems/PD13的问题 # include # define SIZE 32*1024 char buf[SIZE]; main(void) { int i=0,chk =0; unsigned int j =0 ,div =0; int a =0,num =0; char ch; setvbuf(stdin,(char*)NULL,_IOFBF,0); scanf(“%d”,&chk); while(getchar_unlocked() != ‘\n’); while((a = fread_unlocked(buf,1,SIZE,stdin)) >0) { for(i=0;i<a;i++) { if(buf[i] != '\n') { num = […]

`getchar()`在哪里存储用户输入?

我开始阅读“ C编程语言 ”(K&R),我对getchar()函数有疑问。 例如这段代码: #include main() { int c; c = getchar(); putchar(c); printf(“\n”); } 键入toomanychars + CTRL + D (EOF)只打印t 。 我认为这是预期的,因为它是第一个引入的角色。 但接下来是另一段代码: #include main() { int c; while((c = getchar()) != EOF) putchar(c); } 键入toomanychars + CTRL + D (EOF)打印toomanychars 。 我的问题是,如果我只有一个char变量,为什么会这样? 其余的字符存储在哪里? 编辑: 感谢大家的答案,我现在开始明白……只有一个问题: 当给定CTRL + D时,第一个程序退出,而第二个程序打印整个字符串,然后等待更多用户输入。 为什么它等待另一个字符串并且不像第一个那样退出?