将文件的内容读入C中的动态分配数组

li9yvcax  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(94)

因此,我试图比较每个输入文件中的单个字符,然后将其读取到分配到内存中的两个char指针,并与两个输入文件的大小进行比较。第二个文件应该包含第二个文件中输入的第一个文件的所有差异是空白的。我不知道它是否It’把每个文件的内容读到数组中还是什么的有问题。有人能帮我解决吗?
主要方法:

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

  int file1 = -1, file2 = -1, fileDif1 = -1, fileDif2 = -1;
  file1 = open(argv[1], O_RDONLY);
  file2 = open(argv[2], O_RDONLY);
  fileDif1 = open("differencesFoundInFile1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600);
  fileDif2 = open("differencesFoundInFile2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0700);
  handleExceptions(argc, argv[1], argv[2], file1, file2, fileDif1, fileDif2);

  step1(file1, file2, fileDif1);
  step2(argv[1], argv[2], file1, file2, fileDif2);

  close(file1);
  close(file2);
  close(fileDif1);
  close(fileDif2);
  return 0;
}

步骤2,其中错误为

void step2(const char * argv1, const char * argv2, int file1, int file2, int fileDif2) {
    struct timeval begin, end;
    gettimeofday(&begin, NULL);

    struct stat fileStat1;
    struct stat fileStat2;
    stat(argv1, &fileStat1);
    stat(argv2, &fileStat2);
    int size1 = fileStat1.st_size;
    int size2 = fileStat2.st_size;

    char * fileArray1 = malloc(size1), * fileArray2 = malloc(size2); //create array
    read(file1, fileArray1, size1); //store bytes in array
    read(file2, fileArray2, size2); //store bytes in array

    //check for differences and write to file if found
    for(int i = 0; i < size2; i++){
        if(fileArray1[i] != fileArray2[i]){
            write(fileDif2, &fileArray2[i], 1);
        }
    }

    free(fileArray1);
    free(fileArray2);

    //calculate time of completion
    gettimeofday(&end, NULL);
    printf("Step 2 took %f milliseconds\n",
           (((double)end.tv_usec / 1000) - ((double)begin.tv_usec / 1000)));
}

图书馆:

#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

step1()

void step1 (int file1, int file2, int fileDif1) {
    struct timeval begin, end;
    gettimeofday(&begin, NULL); //begin timer
    int bufferSize = 2;
    char * buffer1 = (char *) malloc(sizeof(char) * bufferSize), * buffer2 = (char *) malloc(sizeof(char) * bufferSize);
    buffer1[bufferSize - 1] = '\0';
    buffer2[bufferSize - 1] = '\0';

    int bytesRead = read(file1, buffer1, bufferSize - 1);
    read(file2, buffer2, bufferSize - 1);
    while(bytesRead > 0){
        buffer1[bytesRead] = '\0';
        buffer2[bytesRead] = '\0';
        if(*buffer1!=*buffer2) {
            write(fileDif1, buffer1, bytesRead);
        }
        bytesRead = read(file1, buffer1, bufferSize - 1);
        read(file2, buffer2, bufferSize - 1);
    }

    free(buffer1);
    free(buffer2);

    gettimeofday(&end, NULL);
    printf("Step 1 took %f milliseconds\n",
           (((double)end.tv_usec / 1000) - ((double)begin.tv_usec / 1000)));
}

因此,我试图做的是读取与c文件本身相同的目录中的文本文件的内容。然后,在步骤2中,假设两个文件的内容被存储在两个具有相同大小的文件的char指针的位置。现在存储在两个指针中的内容应该被迭代并进行比较,以查看第二个文件是否与第一个文件.这些差异,然后应该被写入一个新的文件.新的文件确实产生,但它不包含任何不同的字符.我不知道该方法的哪一部分是问题,任何帮助将不胜感激.

5gfr0r5j

5gfr0r5j1#

可能的bug

问题可能是,close()不刷新缓冲的内容。文档说:If you need to be sure that the data is physically stored on the underlying disk, use fsync(2)fsync()。替代方案是使用fopen()fwrite()fclose()that handle that for you
同样在调用step2()之前,您应该调用fseek(file1, 0, SEEK_SET);。对于file2也是如此。否则,文件描述符将指向文件的末尾。

bufferSize = 2注意事项:

如果您将step1中的bufferSize增加到大于2,则检查文件相等性的条件if(*buffer1!=*buffer2)将停止工作。它只检查第一个字符。您可以使用strncmp()来比较更长的缓冲区。

返回值注意事项

还要记住,函数open()read()write()close()返回某些内容是有原因的。这些函数很容易失败,应该检查值以确保正确。您的代码不需要处理这些错误,但至少要将消息打印到stderr,以便您知道代码是否失败。

相关问题