Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t读取用C写在文件上的行_C_File_Writing - Fatal编程技术网

Can';t读取用C写在文件上的行

Can';t读取用C写在文件上的行,c,file,writing,C,File,Writing,我一直在开发这个项目,在这个项目中,分叉后的每个进程都会将其信息写入一个文件,供家长阅读。 我还编写了一个小片段供家长阅读此文件,但每次运行此代码时,它都无法工作。 相反,当我以以下格式手动写入文件时: 567 | A | B | 20 568 | N | A | 2 569 | Z | B | 12 我可以正常阅读,但当我运行此代码时: #include "header.h" struct Individui { pid_t pid; char ti

我一直在开发这个项目,在这个项目中,分叉后的每个进程都会将其信息写入一个文件,供家长阅读。 我还编写了一个小片段供家长阅读此文件,但每次运行此代码时,它都无法工作。 相反,当我以以下格式手动写入文件时:

  • 567 | A | B | 20
  • 568 | N | A | 2
  • 569 | Z | B | 12
我可以正常阅读,但当我运行此代码时:

  #include "header.h"


  struct Individui {
       pid_t pid;
       char tipo[50];
       char nome[50];
       unsigned long genoma;
  };


int main(int argc, char *argv[]) {

    Individuo individuo;
    srand(getpid());

    int min = 2;
    int max = atoi(argv[2]);
    int diff = max - min;
    int r;
    r = rand() % (diff + 1) + min;

    char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rand() % 26];

    individuo.pid = getpid();
    strcpy( individuo.tipo, argv[0]);
    strcpy( individuo.nome, &randomletter);
    individuo.genoma = r;

    FILE *f = fopen("dati.txt", "a");
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    fprintf(f, "%d | %s | %s | %lu\r", individuo.pid, individuo.nome, individuo.tipo, individuo.genoma);

    fclose(f);

    return 0;
}
然后用以下代码读取文件,它不起作用:

int main(){
    char name[4], type[4];
    int pids[4];
    unsigned long genome[4];
    int i = 0;

    FILE * file = fopen("dati.txt", "r"); // "r" = read
    while(fscanf(file, "%d | %c | %c | %ld\n", &pids[i], &name[i], &type[i], &genome[i]) != EOF){
        i++;
    }

    printf ("%d %c %c %lu\n", pids[0], name[0], type[0], genome[0]);
    printf ("%d %c %c %lu\n", pids[1], name[1], type[1], genome[1]);
    printf ("%d %c %c %lu\n", pids[2], name[2], type[2], genome[2]);
}

据我所知,我用流程代码编写的行非常长,而读取文件的代码不支持它。我是C语言的新手,所以我不知道我错在哪里,我希望有人能帮助我。

您的第一个程序没有以第二个程序所期望的格式写入数据

第一个问题是:

strcpy( individuo.nome, &randomletter);
strcpy
函数的第二个参数需要指向以null结尾的字符串的指针。而是将指针传递给单个字符。因此,函数将尝试读取超过单个变量位置的内存。读取内存边界之外的内容将调用

另一个问题是:

fprintf(f, "%d | %s | %s | %lu\r", 
        individuo.pid, individuo.nome, individuo.tipo, individuo.genoma);
您的第二个程序要求第二个和第三个元素使用一个字符,但您将为这两个元素编写字符串。而且,
\r
不是换行符,而是换行符。换行符是
\n

修复方法:

首先将结构更改为使用单个字符而不是字符串,因为您将只编写字符:

  struct Individui {
       pid_t pid;
       char tipo;
       char nome;
       unsigned long genoma;
  };
然后更改分配给这些字段的方式:

individuo.tipo = argv[1][0]; // assumes first command line argument is char to print
individuo.nome = randomletter;
然后写入单个字符并修复换行符:

fprintf(f, "%d | %c | %c | %lu\n", 
        individuo.pid, individuo.nome, individuo.tipo, individuo.genoma);

您的第一个程序没有以第二个程序期望的格式写入数据

第一个问题是:

strcpy( individuo.nome, &randomletter);
strcpy
函数的第二个参数需要指向以null结尾的字符串的指针。而是将指针传递给单个字符。因此,函数将尝试读取超过单个变量位置的内存。读取内存边界之外的内容将调用

另一个问题是:

fprintf(f, "%d | %s | %s | %lu\r", 
        individuo.pid, individuo.nome, individuo.tipo, individuo.genoma);
您的第二个程序要求第二个和第三个元素使用一个字符,但您将为这两个元素编写字符串。而且,
\r
不是换行符,而是换行符。换行符是
\n

修复方法:

首先将结构更改为使用单个字符而不是字符串,因为您将只编写字符:

  struct Individui {
       pid_t pid;
       char tipo;
       char nome;
       unsigned long genoma;
  };
然后更改分配给这些字段的方式:

individuo.tipo = argv[1][0]; // assumes first command line argument is char to print
individuo.nome = randomletter;
然后写入单个字符并修复换行符:

fprintf(f, "%d | %c | %c | %lu\n", 
        individuo.pid, individuo.nome, individuo.tipo, individuo.genoma);
错误修复程序编写器:

char randomletter[2];
randomletter[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rand() % 26];
randomletter[1] = '\0';

strcpy( individuo.nome, randomletter);

fprintf(f, "%d | %s | %s | %lu\n",
    individuo.pid, individuo.nome, individuo.tipo, individuo.genoma);
错误修复阅读器:

void read() {
    char name[4][50], type[4][50];
    int pids[4];
    unsigned long genome[4];

    FILE * file = fopen("dati.txt", "r"); // "r" = read
    for (int i = 0; i < 4; i++) {
        if (fscanf(file, "%d | %s | %s | %lu", &pids[i], name[i], type[i], &genome[i]) != 4)
            break;

        printf ("%d %s %s %lu\n", pids[i], name[i], type[i], genome[i]);
    }
}
void read(){
字符名[4][50],类型[4][50];
int-pids[4];
无符号长基因组[4];
FILE*FILE=fopen(“dati.txt”,“r”);/“r”=读取
对于(int i=0;i<4;i++){
如果(fscanf(文件“%d |%s |%s |%lu”、&pids[i]、名称[i]、类型[i]、&genome[i])!=4)
打破
printf(“%d%s%s%lu\n”,pids[i],名称[i],类型[i],基因组[i]);
}
}
错误修复程序编写器:

char randomletter[2];
randomletter[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rand() % 26];
randomletter[1] = '\0';

strcpy( individuo.nome, randomletter);

fprintf(f, "%d | %s | %s | %lu\n",
    individuo.pid, individuo.nome, individuo.tipo, individuo.genoma);
错误修复阅读器:

void read() {
    char name[4][50], type[4][50];
    int pids[4];
    unsigned long genome[4];

    FILE * file = fopen("dati.txt", "r"); // "r" = read
    for (int i = 0; i < 4; i++) {
        if (fscanf(file, "%d | %s | %s | %lu", &pids[i], name[i], type[i], &genome[i]) != 4)
            break;

        printf ("%d %s %s %lu\n", pids[i], name[i], type[i], genome[i]);
    }
}
void read(){
字符名[4][50],类型[4][50];
int-pids[4];
无符号长基因组[4];
FILE*FILE=fopen(“dati.txt”,“r”);/“r”=读取
对于(int i=0;i<4;i++){
如果(fscanf(文件“%d |%s |%s |%lu”、&pids[i]、名称[i]、类型[i]、&genome[i])!=4)
打破
printf(“%d%s%s%lu\n”,pids[i],名称[i],类型[i],基因组[i]);
}
}

很抱歉,我不知道如何描述它,我只是编译它,尝试用./command启动它,但它什么也不做。
fprintf
fscanf
使用不同的格式。尤其是结尾的
\r
\n
。为什么会这样?已经
strcpy(individuo.nome,&randomletter)是错误的
strcpy
需要空终止符。我之所以使用/n、/r,是因为我认为它可以帮助我以行的形式写入和读取文件。关于strcpy,它意味着什么?很抱歉,我对C完全陌生,我在网上找到的所有信息让我更加困惑。很抱歉,我不知道如何描述它,我只是编译它,尝试用./command启动它,但它什么都不做。
fprintf
fscanf
使用不同的格式。尤其是结尾的
\r
\n
。为什么会这样?已经
strcpy(individuo.nome,&randomletter)是错误的
strcpy
需要空终止符。我之所以使用/n、/r,是因为我认为它可以帮助我以行的形式写入和读取文件。关于strcpy,它意味着什么?很抱歉,我对C完全陌生,我在网上找到的所有信息让我更加困惑,你的意思是
individualduo.nome=randomletter。无法编辑,因为少于六个字符。@PedramAzad谢谢。修正。非常感谢你向我解释我犯的错误。你是说
individualduo.nome=randomletter。无法编辑,因为少于六个字符。@PedramAzad谢谢。修复。非常感谢您向我解释我犯的错误。但我想您最好使用dbush的解决方案,至少对于
nome
,它肯定只有一个字符。如果
tipo
是一个字符串,您可以对该部分使用我的解决方案,而如果
tipo
也是一个单个字符,那么也可以使用dbush的解决方案。我假设你真的需要字符串是因为某种原因。这对我来说非常有用,因为在将来,名字会变成字符串。非常感谢。但我想您最好使用dbush的解决方案,至少对于
nome
,它肯定只有一个字符。如果
tipo
是一个字符串,您可以对该部分使用我的解决方案,而如果
tipo
也是一个单个字符,则使用