我的代码就像一个文本压缩器,读取普通文本并变成数字,每个单词都有一个数字.它在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) 我知道fgets读取直到EOF或换行符.
我写了一个示例代码来读取文件中的行,我观察到fgets的执行次数超过了所需的次数.这是一个非常简单的文件,只有两个空行,即.我按了一次输入并保存了文件.
以下是代码:
fp = fopen("sample.txt","r");
while (!feof(fp)) {
fgets(line,150,fp);
i++;
printf("%s",line);
}
printf("%d",i);
Run Code Online (Sandbox Code Playgroud)
为什么while循环执行三次而不是2次,因为文件中只有两个空行?
我有以下简单的程序从文本文件(num.txt)中读取.文本文件的每行数字为1 2 3 4 5.当我运行程序时,它会打印5次.任何人都能告诉我为什么会发生这种情况,以及如何解决这个问题?提前致谢
int main(void)
{
int number;
FILE *file;
int i = 0;;
file = fopen("num.txt", "r");
while (!feof(file)){
fscanf(file, "%d", &number);
printf("%d\n", number);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的文本文件num.xtx
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
这是程序输出
1
2
3
4
5
5
Run Code Online (Sandbox Code Playgroud)
额外5
在查看fgets§7.21.7.2,3 的ISO C11标准时,会根据概要代码说明返回值:
#include <stdio.h>
char *fgets(char* restrict s, int n, FILE* restrict stream);
Run Code Online (Sandbox Code Playgroud)
如果成功,fgets函数返回s.如果遇到文件结尾且没有字符读入数组,则数组的内容保持不变,并返回空指针.如果在操作期间发生读取错误,则数组内容是不确定的,并返回空指针.
该标准表示为eof返回空指针,并且没有读入任何字符或发生读取错误.我的问题是,只是来自fgets和返回的空指针,是否有办法区分导致错误的两种情况中的哪一种?
我正在编写读取包含DNA碱基的巨大文本文件的代码,我需要能够提取特定部分。该文件如下所示:
TGTTCCAGGCTGTCAGATGCTAACCTGGGG
TCACTGGGGGTGTGCGTGCTGCTCCAGCCT
GTTCCAGGATATCAGATGCTCACCTGGGGG
Run Code Online (Sandbox Code Playgroud)
...
每行30个字符。
我有一个单独的文件来指示这些部分,这意味着我有一个开始值和一个结束值。因此,对于每一个开始和结束的值,我需要提取的文件中的相应字符串。例如,如果我有start = 10,end = 45,则需要将以第一行(C)的第10个字符开始并以第2行(C)的第15个字符结束的字符串存储在单独的临时文件中文件。
我尝试将fread函数(如下所示)用于具有上述字母行的测试文件。参数分别为:开始 = 1,结束 = 90,结果文件如下:
TGTTCCAGGCTGTCAGATGCTAACCTGGGG
TCACTGGGGGTGTGCGTGCTGCTCCAGCCT
GTTCCAGGATATCAGATGCTCACCTGGG™eRV
Run Code Online (Sandbox Code Playgroud)
每次运行都会在末尾给出随机字符。
代码:
FILE* fp;
fp=fopen(filename, "r");
if (fp==NULL) puts("Failed to open file");
int start=1, end=90;
char string[end-start+2]; //characters from start to end = end-start+1
fseek(fp, start-1, SEEK_SET);
fread(exon,1, end-start+1, fp);
FILE* tp;
tp=fopen("exon", "w");
if (tp==NULL) puts("Failed to make tmp file");
fprintf(tp, "%s\n", string);
fclose(tp);
Run Code Online (Sandbox Code Playgroud)
我不明白fread如何处理\ n字符,因此我尝试将其替换为以下内容:
int i=0; …Run Code Online (Sandbox Code Playgroud) 如果我将一个数组写入输出文件并关闭文件,然后再次打开文件并读取所有文件,直到文件结束,尽管该文件只包含4个数字,程序将读取并打印5个数字,为什么?
节目输出:
a[0] = 4
a[1] = 7
a[2] = 12
a[3] = 34
a[4] = 34
Run Code Online (Sandbox Code Playgroud)
save.bin(使用十六进制编辑器)
04000000 07000000 0C000000 22000000
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include <stdlib.h>
#define path "save.bin"
int main(void)
{
FILE *f=NULL;
int a[]={4,7,12,34},i,n=4,k;
f=fopen(path,"wb");
if(f==NULL)
{
perror("Error");
exit(1);
}
for(i=0;i<n;i++) // or I could use fwrite(a,sizeof(int),n,f);
fwrite(&a[i],sizeof(int),1,f);
fclose(f);
f=fopen(path,"rb");
if(f==NULL)
{
perror("Error");
exit(1);
}
i=0;
while(!feof(f))
{
fread(&k,sizeof(int),1,f);
printf("a[%d] = %d\n",i,k);
i++;
}
printf("\n");
fclose(f);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 使用C,有没有办法只读取文件的最后一行而不循环它的整个内容?
事情是该文件包含数百万行,每行包含一个整数(long long int).文件本身可能非常大,我认为甚至高达1000mb.我确定最后一行不会超过55位数,但也可能只有2位数.使用任何类型的数据库都没有选择...我已经考虑过了.
也许这是一个愚蠢的问题,但是来自PHP背景我觉得很难回答.我到处找,但一无所获干净.
目前我正在使用:
if ((fd = fopen(filename, "r")) != NULL) // open file
{
fseek(fd, 0, SEEK_SET); // make sure start from 0
while(!feof(fd))
{
memset(buff, 0x00, buff_len); // clean buffer
fscanf(fd, "%[^\n]\n", buff); // read file *prefer using fscanf
}
printf("Last Line :: %d\n", atoi(buff)); // for testing I'm using small integers
}
Run Code Online (Sandbox Code Playgroud)
这样我循环文件的内容,一旦文件大于~500k行,事情就会慢下来......
先感谢您.格言
我总是使用这种方法
int c;
while ((c = fgetc(fp))!=EOF)
{
printf("%c", c);
}
Run Code Online (Sandbox Code Playgroud)
因为在我看来,它更具可读性和强大性.但是对于我的链接答案,chux评论说
if(feof(fp))比int c更健壮; while((c = fgetc(fp))!= EOF)
如
while(1)
{
c = fgetc(fp);
if ( feof(fp) )
{
break ;
}
printf("%c", c);
}
Run Code Online (Sandbox Code Playgroud)
比第一个版本更强大.那么我应该使用什么版本?请解释一下为什么这个版本更好.
编辑
问题为什么"while(!feof(file))"总是错的?有人问为什么控制循环中的feof()总是错误的.但feof()以适当的方式检查条件是否总是错误的?解释很明显.
对于我的任务,我需要使用fread/fwrite.我写
#include <stdio.h>
#include <string.h>
struct rec{
int account;
char name[100];
double balance;
};
int main()
{
struct rec rec1;
int c;
FILE *fptr;
fptr = fopen("clients.txt", "r");
if (fptr == NULL)
printf("File could not be opened, exiting program.\n");
else
{
printf("%-10s%-13s%s\n", "Account", "Name", "Balance");
while (!feof(fptr))
{
//fscanf(fptr, "%d%s%lf", &rec.account, rec.name, &rec.balance);
fread(&rec1, sizeof(rec1),1, fptr);
printf("%d %s %f\n", rec1.account, rec1.name, rec1.balance);
}
fclose(fptr);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
clients.txt文件
100 Jones 564.90 200 Rita 54.23 300 Richard -45.00
产量
Account …
我正在尝试从C中的二进制文件中编写和读取链接列表.我的目的是为护理之家保存和加载常驻数据(实际上,我是护士),以便通过资源利用率对每个居民进行分类组.我已经使用一系列结构为固定数量的居民(32,即设施的容量)做了这件事,但现在我需要为一组可变的居民做这件事,以便进行统计研究.显然,对于第一次尝试,我将结构简化为最小,因为实际结构包含109个数据.
我非常接近解决方案,但有些东西不起作用,也就是说,保存列表的每个元素都与一个空格一起交替.这个代码应该读取二进制文件中的列表,在终端上显示它,添加一个新元素,保存列表.当然,每个程序都应该放在一个函数中.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
struct pat
{
char surn [16];
char name [16];
struct pat *next;
};
static FILE *h;
static struct pat *osp;
static struct pat *first;
struct pat *make_structure (void);
int main()
{
initscr();
raw();
keypad (stdscr, TRUE);
noecho();
clear();
osp=make_structure();
first=osp;
h=fopen ("archivio","r");
if (h==NULL)
printw ("Archivio inesistente\n");
else
{
while (!feof(h))
{
printw ("Lungh. nome = %d\n",sizeof osp->name);
fread (osp->surn,sizeof osp->surn,1,h);
fread (osp->name,sizeof osp->name,1,h);
printw ("Cognome: %s\tNome: %s\n",osp->surn,osp->name);
osp->next=make_structure();
osp=osp->next; …Run Code Online (Sandbox Code Playgroud)