相关疑难解决方法(0)

未定义的引用`strlwr'

我的代码就像一个文本压缩器,读取普通文本并变成数字,每个单词都有一个数字.它在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)

c string linker-errors

10
推荐指数
1
解决办法
2万
查看次数

fgets在文件中逐行读取

我知道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次,因为文件中只有两个空行?

c file-io fgets

8
推荐指数
1
解决办法
6万
查看次数

fscanf读取最后一个整数两次

我有以下简单的程序从文本文件(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

c file-io

8
推荐指数
2
解决办法
6899
查看次数

是否可以区分fgets返回的错误

在查看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和返回的空指针,是否有办法区分导致错误的两种情况中的哪一种?

c fgets

8
推荐指数
2
解决办法
758
查看次数

在C中以字符串形式读取文本文件的特定部分?

我正在编写读取包含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)

c

8
推荐指数
1
解决办法
132
查看次数

C读二进制文件

可能重复:
"while(!feof(file))"总是错误的

如果我将一个数组写入输出文件并关闭文件,然后再次打开文件并读取所有文件,直到文件结束,尽管该文件只包含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 binaryfiles file

7
推荐指数
1
解决办法
3万
查看次数

C:只读取文件的最后一行.没有循环

使用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行,事情就会慢下来......

先感谢您.格言

c file-io

7
推荐指数
2
解决办法
2万
查看次数

检查EOF和fgetc()错误的更好方法是什么?

我总是使用这种方法

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()以适当的方式检查条件是否总是错误的?解释很明显.

c fgetc

7
推荐指数
2
解决办法
3738
查看次数

fread()c中的结构

对于我的任务,我需要使用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 io struct fread

7
推荐指数
1
解决办法
1万
查看次数

将链表保存并加载到二进制文件(C)

我正在尝试从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)

c linked-list

7
推荐指数
1
解决办法
941
查看次数

标签 统计

c ×10

file-io ×3

fgets ×2

binaryfiles ×1

fgetc ×1

file ×1

fread ×1

io ×1

linked-list ×1

linker-errors ×1

string ×1

struct ×1